История изменений
Исправление Nervous, (текущая версия) :
(defun factorial(n)
В одну функцию свалены вычисления и вывод, зачем-то изменяемое состояние притащено, с форматированием полный ахтунг, и до кучи ещё и не работает.
результат - почти идеален
Ну да, ага. Вот так уже гораздо лучше %)
(defun fac (n)
"Returns n!, consumes the stack."
(if (zerop n)
1
(* n (fac (1- n)))))
(defun fac-1 (n)
"Returns n!, does not consume the stack."
(labels ((fac-iter (n result)
(if (zerop n)
result
(fac-iter (1- n) (* result n)))))
(fac-iter n 1)))
(fac 5) ; => 120 (7 bits, #x78, #o170, #b1111000)
(fac-1 20) ; => 2432902008176640000 (62 bits, #x21C3677C82B40000)
P.S. Я честно пытался взорвать стек первой реализацией, но у меня не вышло. Наверное, какая-то особая лиспомагия.
Исправление Nervous, :
(defun factorial(n)
В одну функцию свалены вычисления и вывод, зачем-то изменяемое состояние притащено, с форматированием полный ахтунг, и до кучи ещё и не работает.
результат - почти идеален
Ну да, ага. Вот так уже гораздо лучше %)
(defun fac (n)
"Returns n!, consumes the stack."
(if (zerop n)
1
(* n (fac (1- n)))))
(defun fac' (n)
"Returns n!, does not consume the stack."
(labels ((fac-iter (n result)
(if (zerop n)
result
(fac-iter (1- n) (* result n)))))
(fac-iter n 1)))
(fac 5) ; => 120 (7 bits, #x78, #o170, #b1111000)
(fac' 20) ; => 2432902008176640000 (62 bits, #x21C3677C82B40000)
P.S. Я честно пытался взорвать стек первой реализацией, но у меня не вышло. Наверное, какая-то особая лиспомагия.
Исходная версия Nervous, :
(defun factorial(n)
В одну функцию свалены вычисления и вывод, зачем-то изменяемое состояние притащено, с форматированием полный ахтунг, и до кучи ещё и не работает.
результат - почти идеален
Ну да, ага. Вот так уже гораздо лучше %)
(defun fac (n)
"Returns n!, consumes the stack."
(if (zerop n)
1
(* n (fac (1- n)))))
(defun fac* (n)
"Returns n!, does not consume the stack."
(labels ((fac-iter (n result)
(if (zerop n)
result
(fac-iter (1- n) (* result n)))))
(fac-iter n 1)))
(fac 5) ; => 120 (7 bits, #x78, #o170, #b1111000)
(fac* 20) ; => 2432902008176640000 (62 bits, #x21C3677C82B40000)
P.S. Я честно пытался взорвать стек первой реализацией, но у меня не вышло. Наверное, какая-то особая лиспомагия.