Начинаю изучать рекурсию. Увидел пример на сайте IBM в статье
Цитата
Красота Lisp
Брюс Тэйт
Опубликовано 06.03.2007/Обновлено: 06.03.2007
. Хотелось бы понять, в какой последовательности что куда передается, как входит и выходит.
Работаю в Clisp 2.49.
(defun total2 (lst)
(labels ((total-rec (tot lst)
(if lst (total-rec (+ tot (first lst)) (rest lst)) tot)))
(total-rec 0 lst)))
Код для примера[9]>
(total2 '(2 4))
6
[10]> (total2 '())
0
Загружаю командой
(load "c:/a1.lisp")
На странице вот что написано, только это не сильно облегчает понимание сейчас
Цитата
Функция total в листинге 9 принимает список в виде единственного аргумента. Первое выражение if останавливает рекурсию, если список пуст, возвращая ноль. Если нет, функция добавляет первый элемент к сумме остальной части списка. Здесь можно увидеть, почему first и rest сделаны именно такими. first может извлечь первый элемент из списка, а rest облегчает применение концевой рекурсии (tail recursion - тип рекурсии, использованной в листинге 9) к оставшимся элементам.