2016-06-28 181 views
2

我是Python的新手,这就是为什么我在其他人可能会觉得容易的问题上遇到麻烦。Python:在“while”循环中嵌套“If”语句?

这个问题的背景:欧拉项目,问题2.这个问题基本上要求我们在Fibonacci序列中添加所有偶数项,只要每项不超过400万。我决定通过从一个封闭的公式计算第n个斐波那契项来解决在线显示的问题。现在,假设这个函数被称为Fibonacci(n).

我基本上想要做的是循环未知数量的整数,这些整数表示斐波那契集的索引(即1,2,3,4 ...等)和插件每个值到Fibonacci(n).如果结果不知道何时除以2余数,那么这个Fibonacci数添加到初始设置为0。

这里是一些价值是我到目前为止有:

def Fibonacci(n): 
    return (1/(5**0.5))*((((1+5**0.5)/2)**n)-(((1-5**0.5)/2)**n)) 

i=0 
FibSum = 0 
nFib = 0 

while (nFib <= 10): 

    nFib = Fibonacci(i) 

    if(nFib%2==0): 
     FibSum += nFib 

    i += 1 

print FibSum 

(是的,正如你所看到的,我限制斐波那契数列以10结尾,而不是4,000,000;这仅仅是为了测试的缘故。)

现在,这里是我的问题:当我运行这个代码时,我得到2.0而不是10.0(2和8是应该加在一起的两个斐波那契数字)。

怎么回事?我的猜测是循环在到达第三个斐波那契数(2)之后停止,并且不会继续。有人看到我的代码有问题吗?

如果您还有其他问题,请发表评论。提前致谢。

+1

只是一个风格和完全不相关的笔记,但你不需要''while'和'if'语句中条件的括号。做例如'而nFib <= 10:'没问题。 –

+1

这是因为你使用浮点数学,你得到〜* 8.000000000000002 *而不是8。 –

+0

应该通过做nFib = int(斐波那契(i)) – ShadowFlame

回答

2

由Gal Dreiman提供的解决方案很好,但功能转换更好,下面是您的修改代码:

def Fibonacci(n): 
    return int((1/(5**0.5))*((((1+5**0.5)/2)**n)-(((1-5**0.5)/2)**n))) 
+1

我更喜欢从数学的角度来看你的解决方案,因为斐波那契数列是一个整数序列,我认为浮点问题是出于计算问题。因此,这个函数只能返回方程在纸面上应该表达的一个整数。谢谢! – daOnlyBG

2

你有一个浮点问题(你可以在here上阅读) - 返回值'nFib'不是一个整数,也不是一个四舍五入的值。我跑你的代码,并在每次迭代中添加打印此值,并得到:

0.0 
1.0 
1.0 
2.0 
3.0000000000000004 
5.000000000000001 
8.000000000000002 
13.000000000000002 

对此的解决方案是修改代码,如下所示:

nFib = int(Fibonacci(i)) 

后,我得到了输出:10

+0

感谢您的回复和链接! – daOnlyBG

2

问题是与nFib%2==0比较。在这里,您尝试比较浮点数LHS和整数0.因此,请按如下所示修改if循环或将返回值修改为return int((1/(5**0.5))*((((1+5**0.5)/2)**n)-(((1-5**0.5)/2)**n)))

>>> def Fibonacci(n): 
...  return (1/(5**0.5))*((((1+5**0.5)/2)**n)-(((1-5**0.5)/2)**n)) 
... 
>>> i=0 
>>> FibSum = 0 
>>> nFib = 0 
>>> while (nFib <= 10): 
...  nFib = Fibonacci(i) 
...  if(int(nFib%2)==0): 
...    FibSum += nFib 
...  i += 1 
... 
>>> print FibSum 
10.0