Python:在 "while" 循环中嵌套 "If" 语句?

Python: Nesting an "If" statement inside a "while" loop?

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

本题背景:Euler Project,问题 2。本题本质上要求我们将斐波那契数列中的所有偶数项相加,使得每一项都在 4,000,000 以下。我决定通过从封闭公式计算第 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) 后停止并且不会继续超出该数。有人看到我的代码有问题吗?

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

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

0.0
1.0
1.0
2.0
3.0000000000000004
5.000000000000001
8.000000000000002
13.000000000000002

解决方法修改代码如下:

nFib = int(Fibonacci(i))

之后我得到了输出:10

Gal Dreiman提供的解决方案很好,但是用in函数转换更好,下面是你修改后的代码:

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

问题在于 nFib%2==0 比较。在这里,您尝试将浮点数 LHS 与整数 0 进行比较。因此,要么如下修改 if 循环,要么将 return 修改为 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