Python中斐波那契练习的最佳答案是什么?
http://www.scipy-lectures.org/intro/language/functions.html#exercises
练习:斐波那契序列
编写一个显示Fibonacci的n个第一项的函数 序列,由:
定义
u 0 = 1;你 1 = 1
u (n + 2) = u (n + 1) + u n
如果只是询问Fibonacci代码,我会这样写:
def fibo_R(n):
if n == 1 or n == 2:
return 1
return fibo_R(n-1) + fibo_R(n-2)
print(fibo_R(6))
...但是,在本练习中,初始条件均为1和1,计算朝向正方向(+)。我不知道如何设定最终条件。我已经找到了答案,但我找不到任何答案。你会怎么回答这个问题?
答案 0 :(得分:2)
请注意,u_(n+2) = u_(n+1) + u_n
相当于u_n = u_(n-1) + u_(n-2)
,即您之前的代码仍然适用。无论你如何表达问题,斐波那契数字都是根据它们的前辈来定义的。
解决这个问题的一个好方法是定义一个generator,它根据需要产生Fibonacci序列的元素:
def fibonacci():
i = 1
j = 1
while True:
yield i
x = i + j
i = j
j = x
然后,您可以通过例如first N items of the generator itertools.islice
,或者您使用enumerate
来跟踪您看到的数量:
for i, x in enumerate(fibonacci()):
if i > n:
break
print x
拥有一个生成器意味着您可以使用相同的代码来解决许多不同的问题(尽管非常有效),例如:
答案 1 :(得分:1)
计算斐波纳契数列的最佳方法是从开始处开始循环直到计算出第n个数。递归会产生太多方法调用,因为您反复计算相同的数字。
此函数计算第一个n
斐波纳契数,将它们存储在一个列表中,然后打印出来:
def fibonacci(n):
array = [1]
a = 1
b = 1
if n == 1:
print array
for i in range(n-1):
fib = a + b
a = b
b = fib
array.append(fib)
print array
答案 2 :(得分:1)
如果您想要一个超级内存效率的解决方案,请使用仅按需生成下一个号码的生成器:
def fib_generator():
e1, e2 = 0, 1
while True:
e1,e2 = e2, e1+e2
yield e1
f = fib_generator()
print(next(f))
print(next(f))
print(next(f))
## dump the rest with a for-loop
for i in range(3, 50):
print(next(f))
递归解决方案是最优雅的,但速度很慢。 Keiwan的循环对于大量元素来说是最快的。
是的,绝对没有DSM正确观察到的全局变量。谢谢!
答案 3 :(得分:0)
另一种递归方式,只是为了表明事情可以用稍微不同的方式完成:
def fib2(n): return n if n < 2 else fib2( n - 1 ) + fib2( n - 2 )