LINUX.ORG.RU

История изменений

Исправление 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. Я честно пытался взорвать стек первой реализацией, но у меня не вышло. Наверное, какая-то особая лиспомагия.