我创建了一个接收(amount, bills, n)
的代码。账单是可用现金账单的元组,n是您必须准确使用账单才能收到金额的次数。
例如:
atm_rec(70(5,10)7)=真
和
atm_rec(10(2,3,5)6)= False
我使用递归
创建了以下代码def atm_rec(amount, bills, n):
if amount==0:
if n==0:
return True
else:
return False
elif amount<0:
return False
elif len(bills)==0 and amount!=0:
return False
else:
tmp = atm_rec(amount - bills[-1],bills,n-1)
tmp2 = atm_rec(amount,bills[0:-1], n)
return tmp or tmp2
现在我想通过使用memoization来提高效率(dict键是amount
和n
的元组,值是布尔值)但不知何故代码更加懒散。任何建议为什么?
def atm_mem(amount, bills, n,memo = None):
if amount==0:
if n==0:
return True
else:
return False
elif amount<0:
return False
elif len(bills)==0 and amount!=0:
return False
if memo==None:
memo={}
key = (amount, n)
if memo is not None and key not in memo:
tmp = atm_mem(amount - bills[-1], bills, n - 1, memo)
tmp2 = atm_mem(amount, bills[0:-1], n, memo)
memo[key] = tmp or tmp2
return memo[key]
答案 0 :(得分:1)
问题是您没有使用memo
缓存。这样:
if memo is not None:
tmp = atm_mem(amount - bills[-1],bills,n-1,memo)
tmp2 = atm_mem(amount,bills[0:-1], n, memo)
memo[(amount,n)]=tmp or tmp2
无论何时设置memo
,都会执行。
您必须通过检查memo
是否包含您的密钥来避免计算,如下所示:
key = (amount,n) # compute tuple only once
if memo is not None and key not in memo:
tmp = atm_mem(amount - bills[-1],bills,n-1,memo)
tmp2 = atm_mem(amount,bills[0:-1], n, memo)
memo[key]=tmp or tmp2
return memo[key]
因此,当(amount,n)
已经计算出来时,您不会输入if
,只需发出预先计算的结果。