在一个表达式中打印前n个斐波那契数列

phd*_*esq 6 python recursion lambda lambda-calculus fibonacci

所以我一直插科打诨与Python有点最近,我试图找到一种方式来输出Fibonacci序列的第n个数在一个单一的表达.这是我到目前为止编写的代码:

(lambda f: f if f<2 else (f-1)+(f-2))(n)
# n == 1 -> 1
# n == 2 -> 1
# n == 3 -> 3
# n == 4 -> 5
# n == 5 -> 7
....
Run Code Online (Sandbox Code Playgroud)

但是,正如我在上面评论的那样,它只输出一组奇数.我很困惑为什么会发生这种情况,因为如果我要将其重新编写为命名的lambda函数,它看起来像这样:

f = lambda n: n if n<2 else f(f-1)+f(f-2)
# f(1) -> 1
# f(2) -> 1
# f(3) -> 2
# f(4) -> 3
...
# f(10) -> 55
...
Run Code Online (Sandbox Code Playgroud)

现在我添加Lambda Calculus标签的原因是因为我不确定这个问题是否属于简单理解Python如何处理这个问题的范畴.我读过关于演算的Y组合一点点,但是这是一个外语对我无法从我发现这个约演算推导资源什么.

现在,我想这样做的一行代码,而不是命名它的原因,是因为我想尝试,并把这个lambda函数到列表理解.所以做这样的事情:

[(lambda f: f if f<2 else (f-1)+(f-2))(n) for n in range(10)]
Run Code Online (Sandbox Code Playgroud)

并在斐波纳契数列中创建前x个数字的数组.

我正在寻找的是一种在一个表达式中完成这一切的方法,并且它应该属于Lambda演算的范畴,我相信它确实存在,有人可以解释这是如何工作的.

随意提供JavaScript,C#或支持Lambda函数的其他类C语言的答案.

编辑:我找到了我试图做的解决方案:

[(lambda f: (lambda x: f(lambda v: x(x)(v)))(lambda x: f(lambda v: x(x)(v))))(lambda f:(lambda n: n if n<2 else f(n-1)+f(n-2)))(y) for y in range(10)]
Run Code Online (Sandbox Code Playgroud)

我知道这根本不实用,不应该使用这种方法,但我关心的是我这样做,而不是我应该这样做.

cdl*_*ane 2

怎么样:

(lambda f: (4 << f * (3 + f)) // ((4 << 2 * f) - (2 << f) - 1) & ((2 << f) - 1))(n)
Run Code Online (Sandbox Code Playgroud)

它不会以通常的方式启动序列:

0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, ...
Run Code Online (Sandbox Code Playgroud)

但一旦你超过了1,你就没事了。您可以在博客文章斐波那契数的整数公式以及大量相关信息中找到详细说明。

在我的系统上,@lehiester 基于黄金比例的解决方案在 F71 处脱轨,产生 308061521170130,而不是 308061521170129,并继续偏离那里。

  • 很好的解决方案;) (2认同)