遞歸演算法中一種不可忽略的技術(Memoization)
點擊上方藍字關注「小鄭搞碼事」,每天都能學到知識,搞懂一個問題!
有一次在擼代碼的時候,需要去處理一個遞歸的問題,然而,運行的時候發現在運行不了。為什麼呢?
一、常規遞歸實現
函數demo可以認為是這樣的:
使用上面代碼,直接調用factorial(3),本想結果應該是6。結果輸出:
Maxinum call stack size exceeded
遞歸函數的潛在問題是終止不明確或缺少終止條件會導致函數長時間運行,並使得用戶界面處於假死狀態。而且,遞歸函數還可能遇到瀏覽器的「調用棧大小限制」。
除了IE(調用棧與系統空閑內存有關)其它瀏覽器都有固定數量的調用棧限制。
所以當我們使用太多的遞歸,甚至超過最大調用棧容量時,瀏覽器會報告相應的錯誤:
IE:Stack overflow at line x
Ff:Too much recursion
Safari:Maxinum call stack size exceeded
...
盡量避免像上面這樣去使用遞歸函數。正確姿勢看改進型。
二、改進型實現
減少工作量就是最好的性能優化技術,代碼要處理的事越少,它的運行速度就越快。按照這個思路,避免重複工作也是有意義的。多次執行相同的任務純粹是浪費時間。
Mermoization正是一種避免重複工作的方法。下面用一個階乘例子來闡述一下:
上面這個函數的關鍵在於創建一個緩存對象。這個對象存儲在函數自身內部,並預設兩個最簡單的階乘:0和1.在計算一個階乘之前,首先檢查這個緩存對象看是否已經存在相應的計算的結果。沒有對應的緩存值則意味著這是和一次計算,計算完成之後 ,結果被儲存在緩存中為以後所用。
寫在最後的總結:
瀏覽器的調用棧大小限制了遞歸演算法在JavaScript中的應用,棧溢出錯誤會導致其它代碼中斷運行,如果你遇到棧溢出錯誤,可將方法改為迭代演算法,或者使用上面文章提到的Mermoization來避免重複計算。
※node.js-如何操作文件
※微信內置瀏覽器中如何自動播放音頻文件,可以這樣處理
TAG:小鄭搞碼事 |
※Terzo Millennio Concept,看來汽車電動化已是不可逆轉
※The Unreliable Sensation 不可靠的覺受
※Daily Bread】Unlikely Friends 不可能的友誼
※鞋櫃里不可缺少的經典之一adidas Stan Smith
※電影推介:觸不可及 Intouchables
※他問我「what things make india incredible?」你知道為什麼印度是不可思議的國度嗎?
※Angerlababy:不可否認的美
※愛奇藝:《Darling in the FranXX》因不可抵抗力因素暫時下線
※羅馬教練Monchi說,對Edin Dzeko的出價是不可接受的
※明日發售!這款 Air Jordan 11 Low 「Iridescent」 你不可錯過!
※不可抗拒的力量 Juggernaut
※sneakerheads和鞋迷不可不知的 4大冷知識,潮流與NBA的故事
※Facebook非死不可!確實Facebook 呵呵 信息安全
※Taste of Scotland:威士忌是蘇格蘭不可分割的一部分
※不可多得的new school紋身手稿
※你不可少的一件Under Armour安德瑪強森公牛Polo短袖
※Google Home的5個令人不可思議的功能!
※「非死不可」Facebook
※Facebook 非死不可?
※Wanna One 吉隆坡記者會中 齊心表示Wannable不可缺少