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
我是 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