我一直在尝试使用 Python 3 生成斐波那契数列。由于我对编程完全陌生,所以我使用的是基本工具。在本例中列出,作为练习。 我遇到的问题是当我希望序列停止时停止它。
例如,我需要 100 以内的斐波那契数列,所以我这样写:
fib = [1,2]
n = 0
while max(fib) <= 100:
fib.append(fib[n]+fib[n+1])
n = n+1
print(fib)
print(max(fib))
print(n)
print()
声明只是为了我的利益,所以我想知道发生了什么。
作为回报,我得到:
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
144
9
所以一切都工作正常,除了我打算在超过 100 之前完成排序。 为什么我那里有144?我做错了什么?
有几件事:
1, 1, 2, ...
100
,而不是检查下一个元素是否小于100
。所以,第一个显然很容易纠正,只需将
fib
声明为 [1, 1]
即可。
至于第二个,您可以使用
while True
循环,如果下一个元素大于 break
,则将其退出,或者您可以使用一个变量来存储下一个元素,然后检查它是否是小于100
作为对100
的评价。所以,在这行之后:
while
您可以使用:
fib = [1, 1]
或
next = 2
while next <= 100:
fib.append(next)
next += fib[-2]
两者都给出:
while True:
next = fib[-2] + fib[-1]
if next > 100:
break
fib.append(next)
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
break语句的作用是,如果满足中断条件,程序立即跳出循环。
而且你的循环条件有点低效,因为它必须在每次迭代时检查列表 fib 中的最大值。
更简单的方法是这样的
while max(fib) <= 100:
if(fib[n]+fib[n+1] > 100):
break
fib.append(fib[n]+fib[n+1])
n = n+1
这样您的代码就不必在每次迭代时检查最大值
while (fib[n]+fib[n+1] < 100):
fib.append(fib[n]+fib[n+1])
n = n+1
中的最大数字小于或等于 100,但是当您将最后两项加在一起时,最终值可能会更大。
您可以通过在将新值添加到列表之前检查新值来解决此问题。
此外,在 Python 中,您可以通过以下方式访问列表的最后一项
fib
因此,您可以通过更改代码以使用负索引来删除
fib[-1]
。
最后,斐波那契数列应该从 1, 1 开始,而不是 1, 2。
n
fib = [1, 1]
while True:
n = fib[-1] + fib[-2]
if n >= 100:
break
fib.append(n)
print(fib)
为 89 时,您的循环仍将被执行一次,因为它仍然小于 100。因此,它会在找到大于 100 的
max(fib)
之前生成 144。 虽然肯定还有其他方法可以做到这一点,但为了保持一般循环结构,您可以这样做:
max(fib)
它生成的结果超过 100,因为 89+55 是 144,你希望序列小于 100,而不是相加后的值。
尝试在代码中使用“if”语句。
您正在测试“fib”中的最大值是否仍低于 100,然后
然后您正在添加一个新数字。因此,当您测试时,fib 仍然是 [1, 2, 3, 5, 8, 13, 21, 34, 55, 89],然后 144 添加到循环内。
while fib[n]+fib[n+1] < 100:
fib.append(fib[n]+fib[n+1])
n = n+1
>>> fib
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
您想要检查下一个数字是否大于 100,但实际上您正在检查列表中当前最大的数字是否大于 100。
因此,程序不会说“144 大于 100,我们不要相加”,而是“89 小于 100,我们相加 144!”
要解决此问题,您需要检查要添加的数字
next 有多大。您可以在 while 循环中使用 while max(fib) <= 100:
语句来完成此操作,并使用不同的变量来保存是否应该退出循环。例如:
if
另外,正如Joe Iddon
最后我选择了:
fib = [1,1]
n = 0
quit = False
while not quit:
next_num = fib[n]+fib[n+1]
if next_num <= 100:
fib.append(next_num)
n = n+1
else:
quit = True
print(fib)
print(max(fib))
print(n)
在我看来这是最简单的(还有很多东西需要学习)
但我很高兴这里展示了这么多不同的方法。我会尽力记住它们。而且我知道了我的逻辑哪里错了,这也很好。
谢谢
while fib[n]+fib[n+1] < 100
fib.append(fib[n]+fib[n+1])
n = n+1