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

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

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

Добрый день, я новичок в Лисп и написал простенькую функцию по подсчету кол-ва элементов в списке:
(defun kol_vo (lst)
    (if (equal lst nil) 0
        (+ 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 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)))

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


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

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

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