我是LISP的新手。我正在尝试在CLISP中编写函数以生成斐波那契数列的前n个数字。
这是我到目前为止所做的。
(defun fibonacci(n)
(cond
((eq n 1) 0)
((eq n 2) 1)
((+ (fibonacci (- n 1)) (fibonacci (- n 2))))))))
该程序将打印斐波那契数列的第n个数字。我正在尝试对其进行修改,以便它将打印系列,而不仅仅是第n个术语。
是否可以仅使用基本函数在单个递归函数中执行此操作?
是:
(defun fibonacci (n &optional (a 0) (b 1) (acc ()))
(if (zerop n)
(nreverse acc)
(fibonacci (1- n) b (+ a b) (cons a acc))))
(fibonacci 5) ; ==> (0 1 1 2 3)
其背后的逻辑是,您需要知道前两个数字才能生成下一个。
a 0 1 1 2 3 5 ...
b 1 1 2 3 5 8 ...
new-b 1 2 3 5 8 13 ...
我不只返回一个结果,而是累积所有a
-s直到n
为零。
编辑如果没有反向,效率会降低一些:
(defun fibonacci (n &optional (a 0) (b 1))
(if (zerop n)
nil
(cons a (fibonacci (1- n) b (+ a b)))))
(fibonacci 5) ; ==> (0 1 1 2 3)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句