當我們需要使用遞歸來完成某些操作的時候,我們先要了解什么是遞歸
什么是遞歸?
遞歸,就是在運行的過程中調用自己。
一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。
當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。
舉個例子:
1 function fun(){ 2 console.log(new Date()) 3 setTimeout(fun,1000) 4 } 5 fun()
第5行調用fun,fun內的一次定時器每隔1s再調用fun,在函數內部調用自己,這就是遞歸。
跟循環相同的是,遞歸是需要有邊界條件的,否則就變成了死循環。
遞歸-階乘
1 function fun(n){ 2 if(n == 1 || n == 0){ 3 return 1; 4 } 5 return n * arguments.callee(n-1) 6 } 7 console.log(fun(10))
設置了if語句為遞歸限制了邊界。
上面我運用了arguments.callee,那什么是arguments.callee呢?
arguments 的主要用途是保存函數參數, 但這個對象還有一個名叫 callee 的屬性,返回正被執行的 Function 對象,也就是所指定的 Function 對象的正文,簡單點就是指代的就是這個函數的本身,這有利於匿名函數的遞歸或者保證函數的封裝性。
利用 callee 的屬性,返回正被執行的 Function 對象的方法,使得可以得到階乘的結果。
需要注意的是:
現在已經不推薦使用arguments.callee();
原因:訪問 arguments 是個很昂貴的操作,因為它是個很大的對象,每次遞歸調用時都需要重新創建。影響現代瀏覽器的性能,還會影響閉包。
當然第二種方法就是
1 function fun(n){ 2 if(n == 1 || n == 0){ 3 return 1; 4 } 5 return n * fun(n-1) 6 } 7 console.log(fun(10))
arguments.callee用fun取代,一樣可以實現遞歸的效果。
遞歸-菲波那切數列
菲波那切數列{1,1, 2, 3, 5, 8, 13, 21, 34 ...}
可理解為 fun(n) = fun(n-1) + fun(n-2)
當前的值等於前兩個數的和。
function fun(n){
if(n == 1 || n == 2){
return 1;
}
return fun(n-1) + fun(n-2)
}
console.log(fun(9))
同樣為遞歸設置了邊界,輸出第9位的數值。
以上是個人對於遞歸的理解,歡迎廣大博友的指正和補充