Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 欧拉计划';s斐波那契-为什么这个答案有效?_Python - Fatal编程技术网

Python 欧拉计划';s斐波那契-为什么这个答案有效?

Python 欧拉计划';s斐波那契-为什么这个答案有效?,python,Python,下面的解决方案仍然不太适合我的想法。为什么在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) n=4000000 f1=1 f2=1

下面的解决方案仍然不太适合我的想法。为什么在
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)
n=4000000
f1=1
f2=1
相加=0
结果=0
当添加
我一直在解决欧拉项目的一些问题,只是为了在我的免费在线课程之外进行一些创造性的练习(一位朋友告诉我,学习的最好方法是解决项目)

我自己尝试了,尝试了一个递归,意识到它太慢了,我来到堆栈溢出,想看看发生了什么。随后,我在《欧拉计划》中看到了一些关于问题2的非常酷的答案,其中提出:

通过考虑Fibonacci序列中值不超过400万的项,求偶数值项之和


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

斐波那契序列中的每个值都是前两个值的总和
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

  • 等,值从<代码>添加<代码> f2 < /代码>,值在<代码> f2>代码>转移到<代码> f1<代码>每一步。

    你说你已经使用递归的例子,但是为了确保我们在同一页上,考虑函数返回序列号的一般情况。(0是0,3是2,7是13,以此类推):


    我认为您发布的示例可能会让您感到困惑,因为它将b=a+b步骤分为两个步骤。但它实际上只是做了与递归版本相同的事情,即在序列中添加前两个数字。

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

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


    对不起,纸笔的质量;-)

    这两行是斐波那契序列的延续。序列的每个元素都是前2个元素的总和(
    add
    )。通过在循环中重新分配
    f1
    f2
    ,您正在向上移动序列。要计算序列中的下一个值,您需要前面两个值。分配仅仅是沿着顺序移动;你从第一个2开始,下一次迭代你有值2和3,然后你有值3和4,等等。我也试着手工写出来,这更有意义。谢谢你们两位!感谢Martijn Pieters编辑了我的问题,这肯定会让问题更简单。将记住这些提示。这很有帮助!!谢谢:)我明白了!在递归的情况下,这个rfib(num-1)和rfib(num-2)被一次又一次地执行,甚至对于rfib(1),例如。而在迭代的情况下,它是“存储”总和,这样就不必重新计算。就像你说的,他们做同样的事情,只是方式/速度略有不同。这是对差异的正确解释吗?实际上不是rfib(1),因为这是递归函数的退出条件之一(序列中的第0和第1个数字是0和1)。但是是的,对于rfib(2),它称为rfib(0)和rfib(1)。你是对的,这两个函数做同样的事情,我认为你可以看到为什么迭代版本对于较大的数字更好(递归版本对于较大的数字调用自己很多)。作为Python中的一般语句,函数的递归版本将更容易理解,而迭代版本将更快。
    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