1. 程式人生 > 程式設計 >es6函式之尾遞迴用法例項分析

es6函式之尾遞迴用法例項分析

本文例項講述了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程式設計有所幫助。