Как присвоить вычисляемое значение Mulitpule списку в схеме

Хорошо, это мой 4-й вопрос сегодня о Схеме, все еще довольно новый для Схемы, так как мне нужно было для одной из моих подфункций Я спрашивал ранее в тот же день.

В основном это вернет мне разницу в 2 списка. Скажем, у вас есть (1,5) и (5,1), эта функция должна вернуть мне 8. Так как это расстояние между l и w

Вот что у меня есть. Примечание: если я изменю (list (- (car l) (car w))) на (write ..... ), функция будет работать, но выводит 2 числа, которые я понятия не имею, как использовать эти числа в качестве входных данных. другой моей функции.

Поэтому я пытаюсь поместить его в список, но на самом деле не получается, он возвращает меня без ошибок, но со странными вещами.

(define (difference l w) ; calc heuristic function estimation
    (if (> (car l) (car w))
        (list (- (car l) (car w)))
        (if (< (car l) (car w))
        (list (- (car w) (car l)))))
        (if (< (list-ref l 1) (list-ref w 1))
            (list (- (list-ref l 1) (list-ref w 1)))
            (if (> (list-ref l 1) (list-ref w 1))
                (list (- (list-ref w 1) (list-ref l 1)))))
   )

Вот код вернул мне

> (difference '(9 1) '(3 1))
#<procedure:...0\assigment 2.ss:50:3>

Любые идеи? попробуйте использовать лямбда в конечном итоге то же самое.


person Jonathan    schedule 16.10.2009    source источник
comment
Я не совсем уверен, что понимаю, что пытается сделать ваша функция.   -  person Andrew Song    schedule 16.10.2009
comment
в основном я пытаюсь вычислить разницу 2 элементов из 2 списка. Скажем, я получил 1 из моего первого элемента в списке A и 2 из моего первого элемента в списке B. Я хочу сначала увидеть, какой из них больше, а затем выполнить вычитание, и он вернет мне разницу 1-го элемента списка. То же самое со вторым пунктом списка. Как только я получил оба числа, я складываю их вместе, я получаю общую разницу, в моем случае расстояние от A до B   -  person Jonathan    schedule 16.10.2009
comment
Таким образом, ответ на ваш последний пример будет 6? ((9 - 3) + (1 -1)) = 6   -  person Andrew Song    schedule 16.10.2009


Ответы (2)


Ну, во-первых, в вашем коде опечатка...

(lits (- (car w) (car l)))))

должно быть...

(list (- (car w) (car l)))))

EDIT: что-то подобное будет работать?

(define (difference lst1 lst2) 
    (if (> (car lst1) (car lst2))
        (+ (- (car lst1) (car lst2)) (difference (cdr lst1) (cdr lst2)))
        (+ (- (car lst2) (car lst1)) (difference (cdr lst1) (cdr lst2))))
)
person Andrew Song    schedule 16.10.2009
comment
oopz, вместо этого я использовал запись, и она отлично работает, но я не могу использовать вывод ни на какой ввод. Мне бесполезно использовать функцию записи или отображения. Поэтому я пытаюсь использовать минусы, добавлять, перечислять, ни один из них не работает. - person Jonathan; 16.10.2009
comment
странно, что я не использовал cdr, потому что машина возвращает мне номер, а cdr возвращает мне один номер списка. Да, поэтому я использую list-ref, чтобы убедиться, что я могу выполнить расчет - person Jonathan; 16.10.2009
comment
car возвращает «первый» элемент списка, который является просто числом. cdr возвращает «остальную часть» списка, который представляет собой список длины один (вспомните указатели в C). (list-ref .. N) возвращает N-й элемент списка, поэтому (list-ref .. 1) фактически равно (car (cdr lst)) или сокращенно (cadr lst). Если это сработало для вас, не стесняйтесь принять ответ. - person Andrew Song; 16.10.2009

Я знаю, что это старый вопрос, но я только что написал что-то вроде этого. Вот мое решение

(define (difference l1 l2)
  (apply + (map abs (map - l1 l2))))
person Marty Neal    schedule 14.09.2010