Как работает рекурсия в 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)))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д