为什么此函数在重复调用时返回不同的值?

时间:2018-08-17 07:13:23

标签: python recursion

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。请有人帮我解释一下吗?

2 个答案:

答案 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。