我一直在尝试使用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?我做错了什么?
答案 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)
有几件事:
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
在我看来,这是最简单的(仍然需要学习)
但我很高兴这里展示了许多不同的方法。我会试着记住它们。此外,我了解到我的逻辑错误,也很好。
由于