Python 和 fibonnaci [列表] 生成器

问题描述 投票:0回答:9

我一直在尝试使用 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?我做错了什么?

python fibonacci
9个回答
2
投票

有几件事:

  • 斐波那契数列以
    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)



2
投票

[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

这样您的代码就不必在每次迭代时检查最大值 


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



0
投票
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)



0
投票

它生成的结果超过 100,因为 89+55 是 144,你希望序列小于 100,而不是相加后的值。

尝试在代码中使用“if”语句。


0
投票

您正在测试“fib”中的最大值是否仍低于 100,然后

然后

您正在添加一个新数字。因此,当您测试时,fib 仍然是 [1, 2, 3, 5, 8, 13, 21, 34, 55, 89],然后 144 添加到循环内。


0
投票

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

所说,斐波那契数列以“1, 1, 2”开始


0
投票

最后我选择了:

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)

在我看来这是最简单的(还有很多东西需要学习)

但我很高兴这里展示了这么多不同的方法。我会尽力记住它们。而且我知道了我的逻辑哪里错了,这也很好。

谢谢


0
投票

while fib[n]+fib[n+1] < 100 fib.append(fib[n]+fib[n+1]) n = n+1

© www.soinside.com 2019 - 2024. All rights reserved.