计算一个简单的ATM'在Python上使用Memoization

时间:2016-12-15 14:59:44

标签: python recursion memoization

我创建了一个接收(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键是amountn的元组,值是布尔值)但不知何故代码更加懒散。任何建议为什么?

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]

1 个答案:

答案 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,只需发出预先计算的结果。