2012-12-08 50 views
3

我遇到了一个奇怪的现象:记忆化的递归函数

我写了一个代码来计算“加泰罗尼亚号”,其工作,但现在我想通过使用记忆化的字典,以提高运行时(称为它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] 

这里的渔获物 - 在Eclipse - Pydev的 - 为n=1代码运行中途打印效果与预期:“dicatalan是1:1”停止神秘之前,但在IDLE同一代码打印“双癸酸是0:1“。

任何情况下,当试图打印稍后我接收到的{} dicatalan。

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

dict有什么想法吗?

+0

我不认为你曾经0存储在dicatalan,这是进一步的问题的原因。 –

+2

缩进代码后,它在这里工作得很好(字典内容,印刷品,结果)。您可以确认您的缩进是否与您的帖子上的编辑相同? – mmgp

+0

@mmgp我可以确认代码适用于我:) –

回答

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] 
+0

大家好, 现在我觉得好笑。可能是由于错误语法(dicatalan [(n)])导致的问题...复制缩进代码后(谢谢mmgp) - 现在它也适用于我。 sega_sai - 你是对的,但它不会造成应得的结果... wim - 非常优雅,可爱的一个。 非常感谢大家。 – jizanthapus

+0

@ user1868486只是一个说明:'dicatalan [(n)]'完全等同于'dicatalan [n]',所以这不是导致问题的原因。另外,我没有做这个改变,它被别人进一步编辑。但是,我将缩进更改为我认为合理的,所以如果您仍然有原始代码,可以将其与缩进编辑进行比较(您可以通过点击底部的“编辑X小时前”链接查看进行了哪些编辑你的帖子)。 – mmgp