Lisp Часть 2 Языковые конструкции и примеры.

Материал из MediaWiki
Перейти к навигации Перейти к поиску

Вопросы, касающиеся некоторых приёмов программирования на Lisp и примеры кода.

Как в Lisp'е работать с массивами?

Тема была достаточно подробно рассмотрена на форуме в теме Lisp и массивы

Что такое хвостовая рекурсия?

Хвостовая рекурсия (концевая рекурсия, tail recursion, tail-end recursion) - специальная форма рекурсии для которой на каждом шаге достаточно запоминать лишь текущие значения состояния рекурсивного процесса, а не всю цепочку отложенных состояний. Использование хвостовой рекурсии компилятором превращает рекурсию в итерационный процесс, сокращает расход памяти, которая не тратится на запоминание всех состояний рекурсивного алгоритма и увеличивает скорость работы.

Подробнее про хвостовую рекурсию можно прочесть в wikipedia Tail recursion

Язык Scheme всегда с самого своего возникновения поддерживает хвостовую рекурсию. Её поддержка требуется стандартами языка. В тоже время, стандарт Common Lisp не содержит требования поддерживать хвостовую рекурсию, тем не менее, многие компиляторы Lisp её поддерживают. Например, SBCL - её поддерживает, а CLISP - нет.

Пример хвостовой рекурсии на языке Common Lisp

;;; вычисление факториала


(defun factorial (x)
  (labels ((factorial-rec (number acc)
	     (if (zerop number)
		 acc
		 (factorial-rec (- number 1) (* acc number)))))
    (factorial-rec x 1)))

(print (factorial 100000))
(quit)