我一直在努力解决这个斐波那契问题并正确编写它,但是我总是得到不正确的结果,并且卡在代码的第一个If中。
下面的代码:
def main():
num = 1
num2 = 1
num3 = 2
Katan = True
while Katan == True:
if (num3 == 2):
print num,num2,num3
num3 = num2 + num3
num2 = num3
elif num3 < 10000:
num3 = num + num2
num2 = num
print num,num2,num3
num = num2
else:
Katan = False
if __name__ == '__main__':
main()
答案 0 :(得分:4)
这可以比您使用以下方法更简单:
def main():
# You don't need to store 3 numbers, 2 is enough
num1 = 1
num2 = 1
# You don't need a variable for the while condition, ...
while True:
print num1
if num2 > 10000:
break # ... you can just break it when some condition is met
# You can "switch" variables like this
num1, num2 = num2, num2 + num1
if __name__ == '__main__':
main()
您可以使用a generator使它更加简单。
答案 1 :(得分:1)
已向您展示了更好的斐波那契功能,但是出于学习目的,这就是您的菲博纳奇无法正常工作的原因。
让我们看一下您的while
循环。第一次,您将经历if
块。这会将num3
设置为3
,然后也将num2
设置为3
。因此,您的变量为(num, num2, num3) == (1, 3, 3)
。
然后,下一次迭代将带您进入elif
块。为了清楚起见,我删除了print
。
elif num3 < 10000:
num3 = num + num2
num2 = num
num = num2
如您所见,第一次点击num2 = num
之后,您就不再永远更改num
或num2
的值。您只需将它们设置为彼此相等。因此,num3
不会在第一次经过这两者后再次更改,因为它仅取决于num
和num2
。在我看来,您的实际意图是在最后一行中设置了num = num3
,使用num3
作为临时变量来保留值,同时交换其他变量。进行简单的更改后,代码几乎即可完成您要尝试执行的操作,只有事实证明,实际上根本没有必要使用if
块。 num3 == 2
的情况没什么特别的,实际上是在浪费您的结果。因此,摆脱if
块并将elif
提升为if
,您的程序将或多或少地完成您的期望:
while Katan == True:
if num3 < 10000:
num3 = num + num2
num2 = num
print num,num2,num3
num = num3
else:
Katan = False
该序列的开头仍然存在一些麻烦,但是取决于您实际从中获取最终值的位置,可以通过将初始变量更改为(num, num2, num3) == (0, 1, 1)
来解决。