我是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)后停止,并且不会继续超过该数。有没有人看到我的代码有问题?
如果您有任何其他问题,请发表评论。提前致谢。
答案 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