【发布时间】:2014-01-11 14:57:29
【问题描述】:
我想将我的硬币找零功能转换为记忆功能
为此,我决定使用字典,这样我的字典中的键将是硬币,值将是一个列表,其中包含所有可以更改“键”硬币的硬币。
我所做的是:
def change(a,kinds=(50,20,10,5,1)):
if(a==0):
return 1
if(a<0 or len(kinds)==0):
return 0
return change(a-kinds[0],kinds)+change(a,kinds[1:])
def memoizeChange(f):
cache={}
def memo(a,kinds=(50,20,10,5,1)):
if len(cache)>0 and kinds in cache[a]:
return 1
else:
if(f(a,kinds)==1):
cache[a]=kinds // or maybe cache[a].append(..)
return cache[a]+memo(a-kinds[0],kinds)+memo(a,kinds[1:])
return memo
memC=memoizeChange(change)
kinds=(50,20,10,5,1)
print(memC(10,kinds))
我想得到一些建议,或者也许有其他方法可以做到这一点。
谢谢。
编辑
备忘版:
def change(a,kinds=(50,20,10,5,1)):
if(a==0):
return 1
if(a<0 or len(kinds)==0):
return 0
return change(a-kinds[0],kinds)+change(a,kinds[1:])
def memoizeChange(f):
cache={}
def memo(a,kinds=(50,20,10,5,1)):
if not (a,kinds) in cache:
cache[(a,kinds)]=f(a,kinds)
return cache[(a,kinds)]
return memo
change=memoizeChange(change)
print(change(10))
【问题讨论】:
-
由于您是递归调用函数,请考虑将 memoization 注入函数本身,并递归调用 memoized 函数,这样您在请求新值时将重用现有的 memoized 函数结果。
-
@perreal “重复”很好理解它的想法,我面临的是如何保存重复值并避免它的方法。不过还是谢谢。
标签: python memoization