Вот рабочая версия вашего кода, которая возвращает список в правильном порядке (я заменила l
на n
):
(define (countup n)
(if (= 1 n)
(list n)
(append (countup (- n 1)) (list n))))
К сожалению, есть проблема с этим фрагментом кода: это не хвостовая рекурсия.Причина в том, что рекурсивный вызов countup
не находится в хвостовой позиции.Это не в хвостовой позиции, потому что я делаю добавление результата (countup (- l 1))
, поэтому хвостовой вызов равен append
(или list
при n = 1
), а не countup
.Это означает, что этот фрагмент кода является нормальной функцией с повторным получением, но с хвостовой рекурсивной функцией.
Проверьте эту ссылку из Википедии, чтобы получить лучший пример того, почему это не хвостовой возврат.1016 *
Чтобы сделать его хвостовой рекурсивной, вам понадобится аккумулятор, ответственный за накопление подсчитанных значений.Таким образом, вы сможете поместить рекурсивный вызов функции в конечную позицию.Обратите внимание на разницу в ссылке, которую я вам дал.
Не стесняйтесь отвечать, если вам нужна дополнительная информация.