내 함수는 숫자 목록의 값이 모양이나 모양에 상관없이 내 대상에 추가되는지 여부를 확인합니다. 내 코드는 다음과 같습니다 :하위 집합 함수를 메모하는 방법을 알아낼 수 없습니다.
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과 같은 더 큰 값에는 적용되지 않지만 더 작은 값에 대해서는 작동합니다. 메모 리 제이션이 재귀 한도 혹을 극복해야하지 않습니까?
당신을 (
useIt
는 사실에도 불구하고,loseIt
부분은, 그렇지 않으면 실행됩니다) 정말 깊은 재귀를 사용하려고합니다. 재귀 심도 한계에 도달했습니다. 깊이 재연되지 않는 알고리즘을 선택하십시오. – user2357112메모 작성에 문제가 없습니다. 너의 memoization 논리는 괜찮아. – user2357112
첫 번째'if' 문은'if target == 0 : return True'이어야합니다. 그렇지 않으면'True'가 반환되지 않습니다. (0 == 거짓). 그렇지 않니? – falsetru