【发布时间】:2017-08-18 23:02:30
【问题描述】:
我的函数应该找出数字列表的值是否以任何形状或形式加起来到我的目标。我的代码是:
def memoizedSubset(target, numberList, memo):
''' Returns True if there exists a subset of numberList that adds
up to target and returns False otherwise.'''
if target == 0:
return True;
elif numberList == ():
return False;
elif (target, numberList) in memo:
return memo[(target, numberList)];
elif numberList[0] > target:
solution = memoizedSubset(target, numberList[1:], memo);
memo[(target, numberList)] = solution;
return solution;
else:
useIt = memoizedSubset(target - numberList[0], numberList, memo);
loseIt = memoizedSubset(target, numberList[1:], memo);
solution = useIt or loseIt;
memo[(target, numberList)] = solution;
return solution;
numberTuple = tuple(range(2, 100, 2));
print(memoizedSubset(1234567, numberTuple, {}));
逻辑似乎完美无缺,但是当我尝试运行该函数时,我得到了达到最大递归深度的错误。我使用字典来加速这个过程,因为对于给定的值,没有字典需要一段时间才能完成它。我终其一生都无法弄清楚问题所在。
更新:该代码适用于较小的值,但不适用于较大的值,例如上面的 1234567。记忆化不应该超过递归限制驼峰吗?
【问题讨论】:
-
您正在尝试使用非常非常深的递归。您正在达到递归深度限制。选择一个递归不那么深的算法。
-
备忘不是问题。你的记忆逻辑很好。
-
第一个
if语句应该是:if target == 0: return True。否则没有True返回。 (0 == 错误)。不是吗? -
@falsetru 是的,我刚刚在我的代码中修复了这个问题,我在这里快速编辑它
-
“记忆不是应该克服递归限制驼峰吗?” - 不。记忆并非旨在解决递归限制问题。它减少了递归函数进行的冗余递归调用的数量,但不能保证使调用堆栈更浅。
标签: python arrays dictionary recursion tuples