Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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 为什么这个函数在重复调用时返回不同的值?_Python_Recursion - Fatal编程技术网

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

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),它第一次输出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 = {}
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