作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我最近一直在研究 Python,我试图找到一种方法来在单个表达式中输出斐波那契数列的第 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
....
但是,正如我在上面评论的那样,这只会输出一组奇数。我很困惑为什么会这样,因为如果我将其重写为命名的 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
...
现在我添加 Lambda 微积分标签的原因是因为我不确定这个问题是否属于简单理解 Python 如何处理这个问题的范畴。我读过一些关于 lambda 演算中 Y 组合器的内容,但这对我来说是一门外语,无法从我找到的关于 lambda 演算的资源中得到任何信息。
现在,我尝试在一行代码中执行此操作而不是为其命名的原因是因为我想尝试将此 lambda 函数放入列表推导式中。所以做这样的事情:
[(lambda f: f if f<2 else (f-1)+(f-2))(n) for n in range(10)]
并创建斐波那契数列中前 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)]
我知道这根本不实用,永远不应该使用这种方法,但我关心的是我能否这样做,而不是我是否应该这样做。
最佳答案
您需要将 lambda 分配给一个实际变量,然后调用 lambda 内部的 lambda:
>>> g = lambda f: f if f < 2 else g(f-1)+g(f-2)
>>> [g(n) for n in range(10)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
关于python - 在一个表达式中打印斐波那契数列的前 n 个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46498798/
我是一名优秀的程序员,十分优秀!