[英]Project Euler's Fibonacci - Why does this answer work?
以下解决方案仍然不太适合我。 为什么在while
循环中f1 = f2
和f2 = add
?
n = 4000000
f1 = 1
f2 = 1
add = 0
result = 0
while add < n:
f1 = f2
f2 = add
add = (f1 + f2)
if add % 2 == 0:
result = result + add
print (result)
我一直在为免费的在线课程之外的一些创造性练习解决一些Euler项目的问题(一个朋友告诉我最好的学习方法是解决项目)。
我自己尝试了一下,尝试了递归,意识到它太慢了,然后进入Stack Overflow看看结果如何。 随后,我在Project Euler中看到了关于问题2的一些非常酷的答案,该问题询问:
通过考虑斐波那契数列中值不超过四百万的项,找到偶值项的总和。
我的目标是理解和学习,并且我已经开始理解递归和迭代之间的区别。
斐波那契数列中的每个值都是前两个值的和。 f1
和f2
仅跟踪前两个值。
通过分配的值f2
到f1
和前面的结果add
到f2
沿着序列,该算法转向只保留最后的两个计算。
步骤:
f1 = 1
, f2 = 0
,结果add = 1
f1 = 0
, f2 = 1
,结果add = 1
f1 = 1
, f2 = 1
,结果add = 2
f1 = 1
, f2 = 2
,结果add = 3
f1 = 2
, f2 = 3
,结果add = 5
f1 = 3
, f2 = 5
,结果add = 8
等等,其中从add
的值移动到f2
,而在f2
的值移动到f1
每一步。
您说您已经使用了递归的情况,但是为了确保我们在同一页上,请考虑该函数返回序列中的numth数字的一般情况(0th为0,3rd为2,7th为13等):
def rfib(num):
return num if num <= 1 else rfib(num - 1) + rfib(num - 2)
现在,通用的迭代版本:
def ifib(num):
a = 0
b = 1
for _ in range(num):
a, b = b, a + b
return a
我认为您发布的示例可能使b = a + b步骤分成两步的地方让您感到困惑。 但实际上,它的作用与递归版本相同,后者将序列中的前两个数字相加。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.