【问题标题】:Python and fibonnaci [list] generatorPython 和斐波那契 [列表] 生成器
【发布时间】:2018-03-24 12:57:36
【问题描述】:

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

【问题讨论】:

  • 因为在你上次迭代的时候,fib中的最后一项是89,所以小于100。因为那个时候条件仍然满足,所以还是多生成一个。
  • 您实际上是在检查数组的最大值是否小于 100。当达到 89 时,最大值为 89,因此执行 while 函数内部的代码。您要做的是将值附加到列表中,仅小于 100。
  • fib[-1] 替换max(fib) 更快,因为fib 列表总是排序的,因此最大元素总是最后一个。

标签: python fibonacci


【解决方案1】:

有几点:

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

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

至于第二个,您可以使用while True 循环,如果下一个元素大于break,则可以使用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]

【讨论】:

    【解决方案2】:

    只需在循环中添加一个 if 语句。

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

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

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

    一个更简单的方法是这样的

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

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

    【讨论】:

      【解决方案3】:

      你得到的错误很简单。您正在检查 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)
      

      【讨论】:

        【解决方案4】:

        如上所述,问题是当 max(fib) 为 89 时,您的循环仍会再执行一次,因为它仍然小于 100。因此,它会在找到大于的 max(fib) 之前生成 144 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]
        

        【讨论】:

          【解决方案5】:

          没有错,你想要的就是错的。

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

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

          【讨论】:

            【解决方案6】:

            当你开始编程时,这是一个非常常见的错误:)

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

            【讨论】:

              【解决方案7】:

              当你这样做时

              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)
              

              另外,正如Joe Iddon 所说,斐波那契数列以“1、1、2”开头

              【讨论】:

                【解决方案8】:

                这么多回复:)

                最后我选择了:

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

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

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

                谢谢

                【讨论】:

                  猜你喜欢
                  • 2011-04-26
                  • 1970-01-01
                  • 2011-12-18
                  • 2015-04-25
                  • 2017-11-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-05-04
                  相关资源
                  最近更新 更多