我想將我的硬幣更改功能轉換爲記憶功能
要做到這一點,我決定使用字典,以便我的字典中的鍵將是硬幣,並且值將是包含所有可以改變「鑰匙」硬幣的硬幣。
我所做的是:
記憶錢幣變化
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))
我希望得到一些建議,也許有另一種方式來做到這一點。
謝謝。
編輯
Memoized版本:0
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))
可能重複[有一個裝飾簡單地緩存函數返回值?(http://stackoverflow.com/questions/815110/is -there-A-裝飾到簡單的緩存功能回-v api) – perreal
由於您正在遞歸地調用函數,因此可以考慮將memoization注入到函數本身中,並遞歸地調用memoized函數,這樣您就可以在請求新值時重用現有的memoized函數結果。 –
@perreal「複製」它的罰款來理解它的想法,我面臨的是如何保存重複值並避免它的方法。但無論如何感謝。 –