Python和fibonnaci [list] generator

时间:2018-03-24 12:57:36

标签: python fibonacci

我一直在尝试使用Python 3生成Fibonacci序列。因为我完全不熟悉编程,所以我使用的是基本工具。在这种情况下列出,作为练习。 我的问题是,当我希望它停止时,停止序列。

例如,我需要一个高达100的Fibonacci,所以我写了这个:

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 个答案:

答案 0 :(得分: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语句的作用是,如果满足中断条件,程序会立即退出循环。

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

更简单的方法就是这样

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

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

答案 1 :(得分:2)

有几件事:

  • Fibonacci序列以1, 1, 2, ...
  • 开头
  • 检查最大元素是否小于100,而不是检查 next 元素是否小于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 :(得分:1)

您获得的错误非常简单。您正在检查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)

答案 3 :(得分:0)

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

它产生的数量超过100,因为89 + 55是144,你希望序列小于100,而不是它们在添加后的值。

尝试使用&#34;如果&#34;代码中的陈述。

答案 4 :(得分:0)

如上所述,问题是当max(fib)为89时,你的循环仍将再次执行,因为它仍然小于100.因此,它会在找到{{1}之前生成144大于100。

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

max(fib)

答案 5 :(得分:0)

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

您正在测试&#39; fib&#39;中的最大值。仍然低于100,然后您要添加新号码。因此,当您测试时,fib仍然是[1,2,3,5,8,13,21,34,55,89],然后在循环内添加144。

答案 6 :(得分:0)

当你这样做时

if

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

因此,不是程序说“144大于100,不允许添加它”,而是“89小于100,让我们加144!”

要解决此问题,您需要检查您正在添加 next 的数量。你可以在while循环中使用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) 语句执行此操作,并使用不同的变量来保存是否应该退出循环。例如:

CREATE TABLE AUTHORITIES 
(
  AUTHORITY NVARCHAR2(64) NOT NULL 
, USERNAME NVARCHAR2(64) 
, CONSTRAINT AUTHORITIES_PK PRIMARY KEY 
  (
    AUTHORITY 
  )
  USING INDEX 
  (
      CREATE UNIQUE INDEX AUTHORITIES_PK ON AUTHORITIES (AUTHORITY ASC) 
      LOGGING 
      TABLESPACE USERS 
      PCTFREE 10 
      INITRANS 2 
      STORAGE 
      ( 
        INITIAL 65536 
        NEXT 1048576 
        MINEXTENTS 1 
        MAXEXTENTS UNLIMITED 
        BUFFER_POOL DEFAULT 
      ) 
      NOPARALLEL 
  )
  ENABLE 
) 
LOGGING 
TABLESPACE USERS 
PCTFREE 10 
INITRANS 1 
STORAGE 
( 
  INITIAL 65536 
  NEXT 1048576 
  MINEXTENTS 1 
  MAXEXTENTS UNLIMITED 
  BUFFER_POOL DEFAULT 
) 
NOCOMPRESS 
NO INMEMORY 
NOPARALLEL;

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

答案 7 :(得分:0)

如此多的回复:)

最后我选择了:

while fib[n]+fib[n+1] < 100
fib.append(fib[n]+fib[n+1])
n = n+1
在我看来,这是最简单的(仍然需要学习)

但我很高兴这里展示了许多不同的方法。我会试着记住它们。此外,我了解到我的逻辑错误,也很好。

由于