单行斐波那契

3 投票
3 回答
5832 浏览
提问于 2025-04-16 20:26

可能的重复问题:
用Python 3写一个一行代码的斐波那契数列?

这可能很简单,但我对Python还很陌生。我想出了这个单行代码来生成斐波那契数列。

[fibs.append(fibs[-2]+fibs[-1]) for i in xrange(1000)]

不过,这并不是真正的单行代码。我需要在执行这条语句之前先初始化一个列表,fibs,也就是要先写fibs = [0, 1]

现在,我有两个问题:

  1. 我们怎么才能去掉这个列表初始化的语句fibs = [0, 1],让它真正变成一行代码呢?

  2. 原来的语句会打印None,打印n次;这里的n是传给xrange()的数字。有没有办法完全避免这个?或者更好的是,能不能让这条语句直接打印出斐波那契数列?这样我们就不需要单独打印fibs了。

[编辑]

或者,我们有没有其他的替代方法来使用list.append(),让它返回被添加的list呢?

3 个回答

1
def fib(n):
    return (n in (0,1) and [n] or [fib(n-1) + fib(n-2)])[0]

试试这个

2

嗯,这样做其实不太符合Python的习惯用法。你现在做的就是用列表推导式来代替一个for循环。虽然Python的推导式可以有一些副作用,但它并不是为了这个设计的。我想不出有什么办法能让这个工作正常,可能这样也好。

关于你的第二点,想想看,你实际上是在创建一个列表,这个列表里的每个项都是调用fibs.append(fibs[-2]+fibs[-1])的返回值,而这个方法有副作用,所以返回的是None。想了解更多细节,可以查看这个文档

不错的尝试,但这并不是Python的用途哦 :)

3

这个可以运行:

for n in range(1000):
    print(0.4472135954999579392818347337462552470881236719223051448541*(pow(1.6180339887498948482045868343656381177203091798057628621354,n) - pow(-0.618033988749894848204586834365638117720309179805762862135,n)))

这是一个关于比奈公式的实现。你可以在这里了解更多:http://en.wikipedia.org/wiki/Fibonacci_number#Relation_to_the_golden_ratio

撰写回答