递归函数中的记忆

时间:2012-12-08 13:39:46

标签: python dictionary memoization

我遇到了一个奇怪的现象:

我编写了一个代码来计算“加泰罗尼亚数字”,但是现在我正试图通过使用Memoization字典(称为dicatalan)来改善运行时间:

dicatalan = {} 
def catalan(n):
    if n == 0:
        return 1
    else: 
        res = 0
        if n not in dicatalan:
            for i in range(n):
                res += catalan(i) * catalan(n - i - 1)
            dicatalan[n] = res
            print ("dicatalan is", dicatalan)
    return dicatalan[n]

这是捕获 - 在日食 - Pydev - 对于n=1代码中途运行并按预期打印:“dicatalan是1:1”然后神秘地停止,但在IDLE中相同的代码打印“dicatalan为0: 1“。

任何情况下,当我尝试打印后来的dicatalan时,我收到了{}。

怎么可能?代码中会发生什么? 运行调试器证明是徒劳的。

有关制作词典的任何想法吗?

1 个答案:

答案 0 :(得分:1)

也适合我,我冒昧地简化了你的代码:

def catalan(n, memo={0: 1}):
  if n not in memo:
    memo[n] = sum((catalan(i) * catalan(n - i - 1)) for i in range(n))
  return memo[n]