Lisp:拼写数字

Lisp: pell numbers

我必须编写一个递归的 Lisp 函数来打印咒语编号而不是最后一个数字。例如 (pellnumbers 6) 应该 return 列表 (0 1 2 5 12 29 70).

这是我的功能

(defun pellRecursive (n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (t (+ (* 2 (pellRecursive (- n 1)))
              (pellRecursive (- n 2))))))

但它只打印最后的数字,有人可以帮我吗?它需要递归。

因此,一开始您就会明白为什么像这样反向生成列表几乎总是更好。这是一个显而易见的方法:

(defun pell (n)
  ;; the n'th pell number
  (cond
   ((= n 0) 0)
   ((= n 1) 1)
   ((> n 1) (+ (* 2 (pell (- n 1)))
               (pell (- n 2))))
   (t (error "horror death crust"))))

现在

(defun pell-list (n)
  (if (< n 0)
      '()
    (cons (pell n) (pell-list (1- n)))))

问题:为什么这种方法很糟糕(尝试计算 (pell-list 50))?

这是另一个做同样事情的函数:

(defun pell-numbers (n)
  (cond
   ((= n 0) '(0))
   ((= n 1) '(1 0))
   ((> n 1)
    (let ((pn-1 (pell-numbers (1- n))))
      (cons (+ (* 2 (first pn-1))
               (second pn-1))
            pn-1)))
   (t (error "bad mutant death"))))

为什么这个这么好多了?