单行斐波那契
可能的重复问题:
用Python 3写一个一行代码的斐波那契数列?
这可能很简单,但我对Python还很陌生。我想出了这个单行代码来生成斐波那契数列。
[fibs.append(fibs[-2]+fibs[-1]) for i in xrange(1000)]
不过,这并不是真正的单行代码。我需要在执行这条语句之前先初始化一个列表,fibs
,也就是要先写fibs = [0, 1]
。
现在,我有两个问题:
我们怎么才能去掉这个列表初始化的语句
fibs = [0, 1]
,让它真正变成一行代码呢?原来的语句会打印
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