递归函数就是在函数体内调用本函数;
递归函数的使用要注意函数终止条件避免死循环;
递归实现形式:
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
}
}
}