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"))))
为什么这个这么好多了?
我必须编写一个递归的 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"))))
为什么这个这么好多了?