Python 和斐波那契 [列表] 生成器

Python and fibonnaci [list] generator

我一直在尝试使用 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() 声明仅供我参考,所以我知道发生了什么。

在 return 我得到:

[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
144
9

所以一切正常,除了我打算在超过 100 之前完成排序。 那为什么我有144呢?我做错了什么?

只需在循环中放置一个 if 语句即可。

while max(fib) <= 100:
        if(fib[n]+fib[n+1] > 100):
            break
        fib.append(fib[n]+fib[n+1])
        n = n+1

break语句的作用是,如果满足中断条件,程序立即跳出循环。

而且你的循环条件有点低效,因为它必须在每次迭代时检查列表 fib 中的最大值。

更简单的方法是这样

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

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

没有错,你想要的错了

因为89+55是144所以生成的多于100,你希望序列小于100,而不是它们相加后的值。

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

如上所述,问题是当 max(fib) 为 89 时,您的循环仍会再执行一次,因为它仍然小于 100。因此,它会在找到 max(fib)大于100.

虽然肯定有其他方法可以做到这一点,但为了保持您的一般循环结构,您可以这样做:

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]

这是开始编程时常犯的错误:)

您正在测试 'fib' 中的最大值是否仍在 100 以下,然后 然后 您正在添加一个新数字。因此,当您测试时,fib 仍然是 [1, 2, 3, 5, 8, 13, 21, 34, 55, 89],然后在循环中添加 144。

几件事:

  • 斐波那契数列以 1, 1, 2, ...
  • 开头
  • 您检查最大元素是否小于 100,而不是检查 下一个 元素是否小于 100.

所以,第一个显然很容易纠正,只需将 fib 声明为 [1, 1] 即可。

至于第二个,你可以使用一个 while True 循环,如果下一个元素大于 100,然后你 break 退出循环,或者你可以有一个变量它存储下一个并检查它是否小于 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]

当你这样做时

while max(fib) <= 100:

你想检查下一个数字是否大于 100,但你实际上是在检查列表中当前最大的数字是否大于 100。

所以,程序不会说“144 大于 100,我们不要相加”,而是“89 小于 100,我们相加 144!”

要解决此问题,您需要检查要添加的 next 的数字有多大。您可以在 while 循环中使用 if 语句来执行此操作,并使用不同的变量来保存是否应该退出循环。例如:

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)

此外,正如 所说,斐波那契数列以“1, 1, 2”开头

您遇到的错误非常简单。您正在检查 fib 中的最大数字是否小于或等于 100,但是当您将最后两项相加时,最终值可能会更大。

您可以通过在将新值添加到列表之前检查它来解决此问题。

此外,在 Python 中,您可以通过执行

访问列表的最后一项
fib[-1]

因此,您可以通过更改代码以使用负索引来删除 n

最后,斐波那契数列应该以 1, 1 而不是 1, 2 开头。

fib = [1, 1]

while True:
    n = fib[-1] + fib[-2]
    if n >= 100:
        break
    fib.append(n)

print(fib)

这么多回复:)

最后我选择了:

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

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

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

谢谢