Python:在“while”循环中嵌入“If”语句?

时间:2016-06-28 07:15:47

标签: python loops if-statement while-loop fibonacci

我是Python新手,这就是为什么我遇到其他人可能会觉得容易的问题的麻烦。

这个问题的背景:欧拉项目,问题2.问题基本上要求我们在斐波那契序列中添加所有偶数项,只要每个项都低于4,000,000。通过从封闭公式计算第n个Fibonacci项,我决定将这个问题与在线显示的许多解决方案略有不同。现在,假设此函数名为Fibonacci(n).

我基本上喜欢做的是循环表示Fibonacci集索引的未知数量的整数(即1,2,3,4 ......等)并将每个值插入{{1如果结果在除以2时没有余数,则将此斐波纳契数加到最初设置为0的某个值。

这是我到目前为止所拥有的:

Fibonacci(n).

(是的,正如你所看到的,我将Fibonacci序列限制在10而不是4,000,000;这只是为了测试的目的。)

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

为什么?我的猜测是,循环在到达第三个Fibonacci数(2)后停止,并且不会继续超过该数。有没有人看到我的代码有问题?

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

3 个答案:

答案 0 :(得分:2)

你有浮点问题(可以在here上阅读) - 返回值'nFib'不是整数而不是舍入值。我运行了你的代码并在每次迭代中为这个值添加了print,并得到了:

0.0
1.0
1.0
2.0
3.0000000000000004
5.000000000000001
8.000000000000002
13.000000000000002

解决方法是为了修改您的代码,如下所示:

nFib = int(Fibonacci(i))

之后我得到了输出:10

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

问题在于nFib%2==0比较。在这里,您尝试将float 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