如何改进我的斐波那契数列生成器?
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. 和 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}")
我做了什么?
我做了一个斐波那契数列生成器,看下面的代码:
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. 和 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}")