以下解决方案仍然不太合适。为什么f1 = f2
循环中有f2 = add
和while
?
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的一些非常酷的答案,其中提出:
通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和。
我的目标是理解和学习,并且我已经开始理解递归和迭代之间的区别。
答案 0 :(得分:3)
Fibonacci序列中的每个值都是前两个值的总和。 f1
和f2
仅跟踪前两个值。
通过将f2
的值分配给f1
,将前一个结果add
分配给f2
,算法会沿着序列移动,只保留最后两个计算。< / p>
分步骤:
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
每一步。
答案 1 :(得分:2)
答案 2 :(得分:0)
你说你曾经处理过递归的情况,但为了确保我们在同一页上,考虑函数的一般情况,返回序列中的numth数(0th为0, 3是2,7日是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分为两步。但它实际上只是做与递归版本相同的事情,即在序列中添加前两个数字。