.
есть, потому что последняя пара в вашем результирующем списке не имеет своего cdr, указывающего на пустой список.Правильный список - это цепочка пар, где последний cdr в цепочке указывает на пустой список.Например,
(list 1 2 3 4 5)
# is equivalent to
(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 '()))))
Но список, который вы создаете:
(cons 1 (cons 2 (cons 3 (cons 4 5)))
Вы получаете .
в списке по той же причине, что (cons 4 5)
печатается как (4 . 5)
.
При написании рекурсивной функции вам необходимо подумать о следующем:
- Каков базовый случай ввода?
- Что должна вернуть функция для этогоinput?
- В неосновных случаях как мне упростить ввод, чтобы приблизиться к основанию?
- Как объединить результат рекурсивного вызова с вводом?
У вас все в порядке, кроме шага 2.
Рассмотрим базовый случай:
(my-append '() 5)
Это должно вернуть (5)
, верно?Но ваша функция просто вернет 5
.Это означает, что вам нужно обернуть item
в список в базовом случае.
(define (my-append lst item)
(if (null? lst)
(list item)
(cons (car lst) (my-append (cdr lst) item))))
Обратите внимание, что встроенная процедура append
предназначена для добавления двух списков, а не добавления списка и одноговещь.Ваша функция является правильным способом определения этой функции.