代码之家  ›  专栏  ›  技术社区  ›  Max

Python和fibonnaci[列表]生成器

  •  1
  • Max  · 技术社区  · 7 年前

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

    8 回复  |  直到 7 年前
        1
  •  2
  •   Joe Iddon    7 年前

    有几件事:

    • 斐波那契序列开始于 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]
    
        2
  •  2
  •   Risalat Zaman    7 年前

    只需在循环中放入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
    

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

        3
  •  1
  •   dangee1705    7 年前

    您得到的错误很简单。您正在检查 fib 小于或等于100,但将最后两项相加时,最终值可能会更大。

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

    此外,在Python中,您可以通过执行以下操作访问列表中的最后一项

    fib[-1]
    

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

    最后,fibonnacci序列应该从1,1开始,而不是1,2。

    fib = [1, 1]
    
    while True:
        n = fib[-1] + fib[-2]
        if n >= 100:
            break
        fib.append(n)
    
    print(fib)
    
        4
  •  0
  •   sacuL    7 年前

    如上所述,问题是当 max(fib) 是89,因为还不到100。因此,在找到 最大值(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]
    
        5
  •  0
  •   teoman    7 年前

    没有什么错,你想要的是错的。

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

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

        6
  •  0
  •   AstridNeu    7 年前

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

    您正在测试“fib”中的最大值是否仍低于100,以及 然后 您正在添加新号码。因此,当您进行测试时,fib仍然是[1、2、3、5、8、13、21、34、55、89],然后在循环中添加144。

        7
  •  0
  •   H. Din    7 年前

    当你这样做的时候

    while max(fib) <= 100:
    

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

    所以,程序没有说“144大于100,不要加”,而是说“89小于100,加144!”

    要解决此问题,需要检查要添加的数字有多大 下一个 是您可以使用 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 Fibonacci序列以“1,1,2”开头

        8
  •  0
  •   Max    7 年前

    这么多回复:)

    最后,我选择了:

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

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

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

    谢谢