用Python进行Fibonacci练习的最佳答案是什么?

2024-05-16 04:14:00 发布

您现在位置:Python中文网/ 问答频道 /正文

用Python进行Fibonacci练习的最佳答案是什么?你知道吗

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,计算将朝正方向(+)。我不知道如何设置结束条件。我一直在寻找答案,但一个也找不到。你怎么回答这个问题?你知道吗


Tags: theorghttpreturnhtmlwwwscipyfunctions
3条回答

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

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正确观察到的全局。谢谢!你知道吗

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

请注意,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

然后可以通过itertools.islice获取first N items of the generator,或者使用enumerate跟踪所看到的数字:

for i, x in enumerate(fibonacci()):
  if i > n:
    break
  print x

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

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

相关问题 更多 >