Python 为什么这个函数在重复调用时返回不同的值?
这就是代码,我知道它不是完全正确的递归代码。我不明白的是,如果我调用rec(5),它第一次输出7,下一次输出5。有人能帮我解释一下吗?您的问题是,当n已经在内存中时,您正在更新内存。第一次Python 为什么这个函数在重复调用时返回不同的值?,python,recursion,Python,Recursion,这就是代码,我知道它不是完全正确的递归代码。我不明白的是,如果我调用rec(5),它第一次输出7,下一次输出5。有人能帮我解释一下吗?您的问题是,当n已经在内存中时,您正在更新内存。第一次rec(5)的整个过程是: rec(5)=rec(3)+rec(4)=rec(1)+rec(2)+rec(4)=1+1+rec(2)+rec(3) 在这之前,一切都是正确的。然后,您的方法将计算rec(2),其中2已在内存中,因此rec(2)的新值为2 如果您不明白原因,请参见此处: memory = {} d
rec(5)
的整个过程是:
rec(5)=rec(3)+rec(4)=rec(1)+rec(2)+rec(4)=1+1+rec(2)+rec(3)
在这之前,一切都是正确的。然后,您的方法将计算rec(2)
,其中2已在内存中,因此rec(2)
的新值为2
如果您不明白原因,请参见此处:
memory = {}
def rec(n):
if n in memory:
value = n
elif n == 1:
value = 1
elif n == 2:
value = 1
elif n > 2:
value = rec(n - 2) + rec(n - 1)
memory[n] = value
return value
然后它计算rec(3)
,3也在内存中,因此rec(3)
现在是3
然后rec(5)=1+1+2+3=7
第二次运行时,由于内存中有5,因此输出为5
一种可能的解决办法:
def rec(n):
if n in memory:
value = n
# ...
memory[n] = value
return value
现在它两次打印5。问题在于value=n,而它应该是
memory = {}
def rec(n):
if n in memory:
value = memory[n]
elif n == 1:
value = 1
elif n == 2:
value = 1
elif n > 2:
value = rec(n - 2) + rec(n - 1)
memory[n] = value
return value
print (rec(5))
print (rec(5))
所以
这意味着2的值也被更新为2。您能清楚地说明您的问题吗?我不确定问题是什么…@故意留下空白,但由于格式问题为什么此代码输出7在第一次使用rec(5)调用函数和输出7。我不明白。@joijioj看看我的解释答案这太清楚了,兄弟。我一直在更新记忆,不管我以前是否使用过它。非常感谢你@不用担心。下次看到这种bug时,可以打印出重要变量(在本例中是内存
),然后自己调试。
memory = {}
def rec(n):
if n in memory:
value = memory[n]
elif n == 1:
value = 1
elif n == 2:
value = 1
elif n > 2:
value = rec(n - 2) + rec(n - 1)
memory[n] = value
return value
print (rec(5))
print (rec(5))
value=memory[n],
value=n