Python:在“while”循环中嵌套“If”语句?
Posted
技术标签:
【中文标题】Python:在“while”循环中嵌套“If”语句?【英文标题】:Python: Nesting an "If" statement inside a "while" loop? 【发布时间】:2016-10-30 09:11:50 【问题描述】:我是 Python 新手,这就是为什么我在解决其他人可能觉得容易的问题时遇到麻烦的原因。
这个问题的背景:欧拉计划,问题 2。这个问题本质上是要求我们将斐波那契数列中的所有偶数项相加,只要每个项小于 4,000,000。我决定通过从封闭公式计算第 n 个斐波那契项来解决这个问题,这与许多在线解决方案显示的有所不同。现在,假设这个函数被称为Fibonacci(n).
我基本上想要做的是循环遍历代表斐波那契集索引的未知数量的整数(即 1、2、3、4... 等)并将每个值插入Fibonacci(n).
如果结果除以 2 时没有余数,则将此斐波那契数添加到最初设置为 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) 后停止,并且不会继续超出此范围。有人发现我的代码有问题吗?
如果您有任何其他问题,请发表评论。提前致谢。
【问题讨论】:
只是一个风格且完全不相关的注释,但您不需要在while
和 if
语句中的条件周围加上括号。做例如while nFib <= 10:
没问题。
这是因为你使用浮点数学,你得到〜8.000000000000002而不是8。
问题是浮点数。斐波那契项的计算涉及除法,这意味着浮动。所以这个模组没有正确评估。
在 Python 中,通常只有类名以大写字母开头。你应该将你的函数重命名为fibonacci
。此外,由于大括号的不寻常使用和缺少空格,您的代码有点难以阅读。阅读PEP 8。
@LutzHorn:有效积分..同意..感谢分享!
【参考方案1】:
Gal Dreiman 提供的解决方案很好,但是用 in 函数转换更好,下面是您修改后的代码:
def Fibonacci(n):
return int((1/(5**0.5))*((((1+5**0.5)/2)**n)-(((1-5**0.5)/2)**n)))
【讨论】:
我实际上从数学角度更喜欢您的解决方案,因为斐波那契数列是整数序列,我认为浮点问题是由计算问题引起的。因此,函数返回方程在纸上应该是一个整数是唯一合适的。谢谢!【参考方案2】:您有一个浮点问题(您可以在here 上阅读)- 返回值“nFib”不是整数,也不是四舍五入的值。我运行了您的代码并在每次迭代中为该值添加了打印结果:
0.0
1.0
1.0
2.0
3.0000000000000004
5.000000000000001
8.000000000000002
13.000000000000002
解决方案是将您的代码修改如下:
nFib = int(Fibonacci(i))
之后我得到了输出:10
【讨论】:
感谢您的回复和链接!【参考方案3】:问题在于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
【讨论】:
以上是关于Python:在“while”循环中嵌套“If”语句?的主要内容,如果未能解决你的问题,请参考以下文章