不在递归函数中传递持久对象并且仍然得到相同的结果

时间:2014-04-17 18:58:57

标签: python recursion

def fib1(n, cache = {}):
    if n <= 1:
        return 1
    if n not in cache:
        cache[n] = fib1(n-1) + fib1(n-2)
    return cache[n]


def fib2(n, cache = {}):
    if n <= 1:
        return 1
    if n not in cache:
        cache[n] = fib2(n-1, cache) + fib2(n-2, cache)
    return cache[n]

为什么当我没有像第二个函数fib2中那样将缓存作为参数传递时,fib1仍然有效?

1 个答案:

答案 0 :(得分:1)

详细说明我上面的评论......

在第一个版本中,cache使用空dict初始化一次,后续函数调用访问此单个dict并对其进行修改。

在第二个版本中,您传递了cache字典,但它仍然是同一个字典。

在这两个版本中,整个程序中只有一个cache dict。即使您将该功能调用100次,也只需一次。可变的默认参数是&#34; sticky&#34;像那样,大部分时间都是坏主意。