Как работает рекурсия в Common Lisp

Узнай цену своей работы

Формулировка задачи:

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

Решение задачи: «Как работает рекурсия в Common Lisp»

textual
Листинг программы
  1. (defun kol-vo (lst)
  2.   (do ((len 0 (1+ len))
  3.        (lst lst (rest lst)))
  4.       ((null lst) len)))

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут