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