[英]Python: Memoization can't be called in Function
無法啟動記憶。 如果我將它設為全局memo
,那么隨后的打印 function 將在第一次打印期間獲取存儲的備忘錄。 請指教,
def howsumhelper(targetsum,numbers):
memo = dict() #this memoization will not initiate. Why?
return howsum(targetsum,numbers,[])
def howsum(targetsum,numbers,combo):
print("Debug==",memo)
if targetsum in memo: return memo[targetsum]
if targetsum == 0:return combo
if targetsum < 0: return None
for number in numbers:
remainder = targetsum - number
if howsum(remainder,numbers,combo) != None:
combo.append(number)
memo[targetsum] = combo
return combo
memo[targetsum] = None
return None
print(howsumhelper(7,[3,4])) #output should be [3,4]
print(howsumhelper(8,[2,3])) #output should be [2,2,2,2]
print(howsumhelper(7,[2,4])) #output should be None
建議以下更改
參考——Python 中的高效記憶——使用發布的解決方案 #2
修訂代碼
def howsum(targetsum,numbers,combo=None,memo=None):
# Initiaze default arguments
if combo is None:
combo = []
if memo is None:
memo = {}
#print("Debug==",memo)
if targetsum in memo: return memo[targetsum]
if targetsum == 0:return combo
if targetsum < 0: return None
for number in numbers:
remainder = targetsum - number
if howsum(remainder,numbers,combo,memo) != None:
combo.append(number)
memo[targetsum] = combo
return combo
memo[targetsum] = None
return None
print(howsum(7,[3,4])) #output should be [3,4] #actually or [4, 3]
print(howsum(8,[2,3])) #output should be [2,2,2,2]
print(howsum(7,[2,4])) #output should be None
Output
[4, 3]
[2, 2, 2, 2]
None
解釋
Function 簽名是:howsum(targetsum,numbers,combo=None,memo=None):
Arguments function 定義中的一個值稱為默認 arguments。 所以組合和備忘錄都有默認的 arguments。
Python 的默認 arguments 在定義 function 時評估一次,而不是每次調用 function 時評估一次。
僅當傳遞實際值時才使用默認值。
因此:
howsum(7,[3,4]) # uses default values, so called with combo = None and memo = None
howsum(8,[2,3]) # uses default values, so called with combo = None and memo = None
howsum(7,[2,4]) # uses default values, so called with combo = None and memo = None
但:
howsum(remainder,numbers,combo,memo) # does not use defaults for combo and memo
# since we are passing values for these arguments
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.