项目Euler的Fibonacci - 为什么这个答案有效?

时间:2015-08-03 15:54:02

标签: python

以下解决方案仍然不太合适。为什么f1 = f2循环中有f2 = addwhile

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序列中的值不超过四百万的项,找到偶数项的总和。

我的目标是理解和学习,并且我已经开始理解递归和迭代之间的区别。

3 个答案:

答案 0 :(得分:3)

Fibonacci序列中的每个值都是前两个值的总和。 f1f2仅跟踪前两个值。

通过将f2的值分配给f1,将前一个结果add分配给f2,算法会沿着序列移动,只保留最后两个计算。< / p>

分步骤:

  1. f1 = 1f2 = 0,结果add = 1
  2. f1 = 0f2 = 1,结果add = 1
  3. f1 = 1f2 = 1,结果add = 2
  4. f1 = 1f2 = 2,结果add = 3
  5. f1 = 2f2 = 3,结果add = 5
  6. f1 = 3f2 = 5,结果add = 8
  7. 等,add的值转移到f2f2的值转移到f1每一步。

答案 1 :(得分:2)

您可以在纸上绘制这样的时间轴,以帮助理解算法:

它显示了变量(行)如何在各种迭代(列)中进行转换

对不起笔&amp;纸质; - )

答案 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分为两步。但它实际上只是做与递归版本相同的事情,即在序列中添加前两个数字。