使用递归在Lisp中生成斐波那契数列?

古怪的技术

我是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

斐波那契数列中生成器的好处

来自分类Dev

如何递归生成斐波那契数列的数组?

来自分类Dev

斐波那契数列的跟踪递归

来自分类Dev

递归和斐波那契数列

来自分类Dev

使用递归MATLAB计算斐波那契数列之和

来自分类Dev

使用斐波那契数列的递归函数

来自分类Dev

如何使用递归获取斐波那契数列?

来自分类Dev

如何生成斐波那契数列

来自分类Dev

如何生成斐波那契数列?

来自分类Dev

使用pyton的斐波那契数列

来自分类Dev

使用斐波那契数列的MIPS

来自分类Dev

使用向量的斐波那契数列

来自分类Dev

使用递归的JavaScript斐波那契

来自分类Dev

MIPS斐波那契使用递归

来自分类Dev

Common Lisp 中的递归、推送值和斐波那契数列

来自分类Dev

斐波那契数列

来自分类Dev

在APL中生成无回路或流量控制的斐波那契数列

来自分类Dev

在asm8086中生成斐波那契数列时出现无限循环

来自分类Dev

递归求解斐波那契数列,无需先验数字

来自分类Dev

Ruby 中的递归斐波那契数列

来自分类Dev

递归斐波那契数列中的堆栈操作

来自分类Dev

斐波那契递归?

来自分类Dev

使用数组而不使用递归技术的斐波那契数列

来自分类Dev

在C中生成错误的斐波那契序列

来自分类Dev

用Python生成斐波那契数列

来自分类Dev

使用递归以最小的运行时间存储斐波那契数列的值

来自分类Dev

不使用数组的斐波那契数列

来自分类Dev

仅使用匿名Lambda的斐波那契数列

来自分类Dev

使用动态编程的斐波那契数列