es6函式之尾遞迴用法例項分析
阿新 • • 發佈:2020-04-26
本文例項講述了es6函式之尾遞迴用法。分享給大家供大家參考,具體如下:
函式呼叫自身,稱為遞迴,如果尾呼叫自身,就稱為尾遞迴。
遞迴非常耗費記憶體。因為需要同時儲存成千上百個呼叫幀,很容易發生“棧溢位”錯誤(stack overflow)。但是對於尾遞迴來說,由於只存在一個呼叫幀,所以永遠不會發生“棧溢位”錯誤。
function factorial(n) { if (n === 1) return 1 return n * factorial(n - 1) }
如果改成尾遞迴,只保留一個呼叫記錄,複雜度O(1)
function factorial(n,total = 1) { if (n === 1) return total return factorial(n - 1,n * total) } factorial(5)
非尾遞迴的 Fibonacci 數列實現如下。
function Fibonacci (n) { if ( n <= 1 ) {return 1}; return Fibonacci(n - 1) + Fibonacci(n - 2); } Fibonacci(10) // 89 Fibonacci(100) // 堆疊溢位 Fibonacci(500) // 堆疊溢位
尾遞迴優化過的 Fibonacci 數
列實現如下。
function Fibonacci2 (n,ac1 = 1,ac2 = 1) { if( n <= 1 ) {return ac2}; return Fibonacci2 (n - 1,ac2,ac1 + ac2); } Fibonacci2(100) // 573147844013817200000 Fibonacci2(1000) // 7.0330367711422765e+208 Fibonacci2(10000) // Infinity
尾遞迴的實現,往往需要改寫遞迴函式,確保最後一步只調用自身。做到這一點的方法,就是把所有用到的內部變數改寫成函式的引數。
函數語言程式設計有一個概念,叫做柯里化(currying),意思是將多引數的函式轉換成單引數的形式。這裡可以使用柯里化。
function currying(fn,n) { return function(m) { return fn.call(this,m,n) } }
感興趣的朋友可以使用線上HTML/CSS/JavaScript程式碼執行工具:http://tools.jb51.net/code/HtmlJsRun測試上述程式碼執行效果。
更多關於JavaScript相關內容可檢視本站專題:《JavaScript常用函式技巧彙總》、《javascript面向物件入門教程》、《JavaScript錯誤與除錯技巧總結》、《JavaScript資料結構與演算法技巧總結》及《JavaScript數學運算用法總結》
希望本文所述對大家JavaScript程式設計有所幫助。