這是一個包裝函式,用于裝飾我們想要記憶的函式。
我寫這篇文章是為了理解記憶是如何作業的,并挑戰自己在不看解決方案的情況下撰寫它。
它有效,但我不確定這是否是最好的方法。
我在用斐波那契函式測驗它時遇到了一些錯誤。我認為這是因為遞回......如果你運行fib(10000)它會給你一個 RecursionError。但是,如果您跑步,fib(100)那么繼續將數量增加一些合理的數量,它將起作用。
我不確定是因為遞回還是因為我撰寫備忘錄函式的方式。
我還在學習,所以我會很感激任何反饋。
這是代碼:
def memo(fun):
cache = {}
def temp(*args):
KEY = (fun, args)
STORED_VALUE = cache.get(KEY)
if STORED_VALUE is None:
VALUE_TO_STORE = fun(*args)
cache[KEY] = VALUE_TO_STORE
return VALUE_TO_STORE
return STORED_VALUE
return temp
由于遞回錯誤,這將不起作用
RecursionError: maximum recursion depth exceeded while calling a Python object
# Fibonacci function
@memo
def fib(n):
if n == 0: return 0
if n == 1: return 1
return fib(n-1) fib(n-2)
這將在合理的時間內起作用,盡管我不得不將其稱為“逐漸”
fib(400)
fib(800)
fib(1200)
fib(1600)
#...
# you got the point...
#...
fib(10000)
我考慮過使用 for 回圈而不是遞回來重寫斐波那契函式,因為它不會有遞回錯誤,但它在計算上會更簡單,而不是作為記憶的一個很好的例子。
這只是使用記憶的一個壞例子嗎?或者有沒有辦法讓它與遞回一起作業?
uj5u.com熱心網友回復:
在處理 . 方面RecursionError,我認為這個答案可能會對您有所幫助。
TL;博士-
Python 對遞回沒有很好的支持,因為它缺少 TRE(尾遞回消除)。
這意味著對遞回函式的每次呼叫都會創建一個函式呼叫堆疊,并且由于堆疊深度有一個限制(默認為 1000),您可以通過 sys.getrecursionlimit 來檢查(當然您可以使用 sys.setrecursionlimit 更改它)但不建議這樣做)您的程式在達到此限制時最終會崩潰。
由于 python 對此沒有很好的支持,因此使用 for 回圈可能會更好一些。當然,我沒有在記憶方面做任何廣泛的事情,所以可能會有更好的答案,但這就是我推薦的!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/527155.html
標籤:Python递归记忆
上一篇:JavaScript:LeetCode'PlusOne'遞回超時問題
下一篇:嘗試使用遞回解決數字助記符問題
