繁体   English   中英

欧拉计画的斐波那契-为什么这个答案有效?

[英]Project Euler's Fibonacci - Why does this answer work?

以下解决方案仍然不太适合我。 为什么在while循环中f1 = f2f2 = 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的一些非常酷的答案,该问题询问:

通过考虑斐波那契数列中值不超过四百万的项,找到偶值项的总和。

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

斐波那契数列中的每个值都是前两个值的和。 f1f2仅跟踪前两个值。

通过分配的值f2f1和前面的结果addf2沿着序列,该算法转向只保留最后的两个计算。

步骤:

  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

等等,其中从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM