定義:
遞歸函數就是在函數體內調用本函數;
遞歸函數的使用要注意函數終止條件避免死循環;
遞歸實現形式:
1.聲明一個具名函數,通過函數名調用
function f(a){ if(a<=1){ return 1 }else{ return a*f(a-1) } }
但是這樣使用會因為 函數名 f 的變化而報錯,
f = null f () // Uncaught TypeError: f is not a function
2. 使用arguments.callee代替函數名
在嚴格模式下不支持使用arguments.callee
3.使用函數表達式
var fun = (function f(a){ if(a<=1){ return 1 }else{ return a*f(a-1) } }) // 或: var f = function (a){ if(a<=1){ return 1 }else{ return a*f(a-1) } } var fun = f;
遞歸返回值
1.遞歸函數相當於一種循環調用,需要避免死循環,給定一個條件停止調用
2.遞歸函數的返回值要返回整個函數
// 返回公約數的數組集合 let fun = (function f(a,n = 1,b=[]){ if(a%n === 0) { b.push(n) } n ++; if(n>a){ return b } return f(a,n,b) // *** 要返回整個函數,不能只是return b })
調用函數
fun(4)
[1, 2, 4]
在 *** 處要返回整個函數,
這是因為當執行條件 n>a 不成立時是沒有返回值的,例如,第一次執行時 n=1,a=4,1>4 為false因而沒有返回值,接着之后的值也都沒有返回
// 可以參考這種形式,有return fun fun (){ return fun(){ return fun(){ return 4 } } } // 可以參考這種形式,沒有return fun fun (){ fun(){ fun(){ return 4 } } }