Python 中的斐波那契练习的最佳答案是什么?

What would be the best answer for this Fibonacci excercise in Python?

Python 中斐波那契练习的最佳答案是什么?

http://www.scipy-lectures.org/intro/language/functions.html#exercises

Exercise: Fibonacci sequence

Write a function that displays the n first terms of the Fibonacci sequence, defined by:

  • u0 = 1; u1 = 1

  • u(n+2) = u(n+1) + un

如果这只是询问斐波那契代码,我会这样写:

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,计算是往正方向(+)走的。我不知道如何设置结束条件。我一直在寻找答案,但找不到任何答案。你会如何回答这个问题?

计算斐波那契数列的最佳方法是简单地从头开始并循环直到计算出第 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

另一种递归只是为了表明事情可以用稍微不同的方式来完成:

def fib2(n): return n if n < 2 else fib2( n - 1 ) + fib2( n - 2 )

如果您想要一个超级内存高效的解决方案,请使用仅按需生成下一个数字的生成器:

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 正确观察到的全局变量。谢谢!

请注意 u_(n+2) = u_(n+1) + u_n 等同于 u_n = u_(n-1) + u_(n-2),即您之前的代码仍然适用。斐波那契数的定义是根据其前身定义的,无论您如何表述问题。

解决这个问题的一个好方法是定义一个generator,它根据需要生成斐波那契数列的元素:

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

拥有一个生成器意味着您可以使用相同的代码来解决许多不同的问题(而且效率很高),例如:

  • 得到第 n 个斐波那契数
  • 获取前 n 个斐波那契数
  • 获取满足某个谓词的所有斐波那契数(例如,所有小于 100 的斐波那契数)