LINUX.ORG.RU

Списки в Scheme/Lisp


0

0

Столкнулся с такой проблемой:

функция

(define (f . x)
(if (<= (length x) 2)
(car x)
(f (cdr x)))

по идее должна вывести последний элемент списка, но она всегда возвращает cdr от первоначального x, т.о. функция вызывается только 1 раз и завершается. Почему?

anonymous

(f 1 2 3) ;; x = (1 2 3) ==> (f (cdr x)) ==> (f (2 3)) ;; x = ((2 3))

anonymous
()
Ответ на: комментарий от anonymous

так и думал... как это обойти, чтобы передавать не один список, а по отдельности все его элементы?

anonymous
()
Ответ на: комментарий от anonymous

Это упражнение из SICP. Там надо с пом-ю такой записи (вроде f . x) написать функцию, которая для списка (1 2 3 4 5) возвращала (1 3 5), а для (2 3 4 5 6) - (2 4 6).

anonymous
()
Ответ на: комментарий от anonymous

исходная ф-ция естественно не решение, просто столкнулся с проблемой subj.

anonymous
()
Ответ на: комментарий от JavaHarlal

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

anonymous
()
Ответ на: комментарий от JavaHarlal

(define (f x) (filter (if (even? (car x)) even? odd?) x))

Выглядит круто, однако задание предлагается до повествования о filter.


"(define (g . w) <body>)

the procedure g can be called with zero or more arguments. If we evaluate

(g 1 2 3 4 5 6)

then in the body of g, w will be the list (1 2 3 4 5 6)

Use this notation to write a procedure same-parity that takes one or more integers and returns a list of all the arguments that have the same even-odd parity as the first argument. For example,

(same-parity 1 2 3 4 5 6 7)
(1 3 5 7)

(same-parity 2 3 4 5 6 7)
(2 4 6)"

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.