如何改进我的斐波那契数列生成器?

How can I improve my fibonacci sequence generator?

我做了什么?


我做了一个斐波那契数列生成器,看下面的代码:

prev_nums = [0, 1]
count = int(1) 

for i in range(20):
    count += 1
    ans = prev_nums[count-1] + prev_nums[count-2]
    print(ans)
    prev_nums.append(ans)

输出:

1
2
3
5
8
13
21
34
55
...

基本上,我有一个 for 循环。每次迭代,我都会将 1 添加到变量 count,这样我就可以跟踪我应该用来查找要加在一起的先前数字的索引。

(斐波那契数列中的下一个值始终等于相加前的两个值)

然后我将该特定迭代中的值附加到列表 prev_nums 以跟踪我已经生成的所有值,以便我可以生成下一个。

如何改进此代码?


我在网上找到了一些斐波那契数列生成器的其他示例,例如:

def fibonacci():
    a=0
    b=1
    for i in range(6):
        print(b)
        a,b= b,a+b

并且,

def fib(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

为什么(或为什么不)这些解决方案 better/worse 比我自己的,我可以从中学到什么来改进我自己的?

你的有一些缺点:

  1. 它只打印数字。这降低了它对特定副作用的可用性。您不能使用这些数字进行进一步处理。
  2. 它构建了一个不断增长的列表,即使您只需要最后两个元素也会耗尽内存。
  3. 您已经硬编码了要生成的斐波那契数的数量。如果需要更多,则必须更改生成代码。
  4. 没有封装在函数中。这降低了它的可重用性。

问题 1. 和 3. 也适用于您提出的第一个备选方案。

参数化生成器函数(第二个提议的替代方案)

def fib(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

没有任何这些问题。如果你想打印一些数字,你可以很容易地做到这一点(看看目的和计数是如何留给调用者的):

for f in fib(5):
    print(f)

或者如果需要,您可以将它们收集在 list 中:

fib_nums = list(fib(5))

或者对它们全部应用一个函数:

for double_fib in map((2).__mul__, fib(5)):
    print(double_fib)

如果您需要带有相应索引的数字,您可以应用内置的实用程序:

for i, f in enumerate(fib(5)):
    print(f"{i}: {f}")