Как работает рекурсия в Common Lisp
Формулировка задачи:
Добрый день, я новичок в Лисп и написал простенькую функцию по подсчету кол-ва элементов в списке:
Писать я вроде более-менее научился, но вот ОСОЗНАНИЕ как работает только сейчас пришло. По сути в Лиспе все сложное сводится к самовычисляемым типам данных, с которыми и совершаются действия.
Вопрос: правильно ли я понимаю принцип рекурсии?
Вот как понимаю этот принцип(смотрю по своей программе):
Например, такой список: '(1 2 3)
1) Запускается функция и доходит до оператора "+"
2) Единица у нас уже как первый аргумент есть, а второй надо вычислить.
3) Вычисляем 2 аргумент: запускаем снова функцию и рядом с первым оператором "+" появляется второй: (+ 1 (+ 1 func
4) Еще раз запускается функция и добавляется единица: (+ 1 (+ 1 (+ 1 func
5) Мы обрабатываем nil, который передается при пустом списке или если 1 элемент в списке... Т.е при nil мы фактически говорим: "Слушай, ты не можешь сложить nil и число, давай, если будет пустой список или содержащий 1 элемент, вернем 0, чтобы его можно было сложить и, наконец, закончить рекурсию". Т.е получилось:
(defun kol_vo (lst) (if (equal lst nil) 0 (+ 1 (kol_vo (cdr lst)))))
(+ 1 (+ 1 ( + 1 0))) #| (+ 1 0 ) = 1 (+1 1) = 2 (+ 1 2) = 3 #|
Решение задачи: «Как работает рекурсия в Common Lisp»
textual
Листинг программы
(defun kol-vo (lst) (do ((len 0 (1+ len)) (lst lst (rest lst))) ((null lst) len)))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д