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(5),它将在第一次输出7,在下一次输出5。请有人帮我解释一下吗?
答案 0 :(得分:4)
您的问题是,当内存中已有n时,您正在更新内存。您第一个rec(5)
的整个过程是:
rec(5) = rec(3) + rec(4) = rec(1) + rec(2) + rec(4) = 1 + 1 + rec(2) + rec(3)
直到这里一切都正确。然后您的方法将计算rec(2)
,其中memory
中已经有2,因此rec(2)
的新值是2。
如果您不明白为什么,请参见此处:
def rec(n):
if n in memory:
value = n
# ...
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:
return 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
答案 1 :(得分:0)
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))
现在它两次都打印5次。问题在于value = n应该是
value=memory[n],
所以
value=n
意味着2的值也将更新为2。