递归
危:递归为函数自己调用自己,使用会同时开辟大量内存,结束后同时释放,一般禁止使用
递归理解为 另一种循环,在函数中调用本身这个函数 那么这种写法就叫做递归
使用递归的时候 一定要有退出递归条件,否则就会造成死递归(栈溢出)
输出位置不同会影响输出结果 eg:
function fun(n) {
console.log(n);
// 结束递归的条件
// 当n >= 5满足条件的时候 那么就会执行return
// 函数中 return 那么就表示return后面的代码不在执行
if (n >= 5) {
return;
}
fun(++n);
}
fun(1);
/*
以下代码执行顺序:
fun(1) 根据函数名字 进入到函数内部 执行函数内部的代码
console.log(1);
fun(++n)===>fun(2)
console.log(2);
fun(++n)===>fun(3)
console.log(3);
fun(++n)===>fun(4)
console.log(4);
fun(++n)===>fun(5)
console.log(5);
n >= 5 条件成立 执行return 不会在执行fun(++n) 函数就执行结束
*/
function fun(n) {
// 结束递归的条件
// 当n >= 5满足条件的时候 那么就会执行return
// 函数中 return 那么就表示return后面的代码不在执行
if (n >= 5) {
return;
}
fun(++n);
console.log(n);
}
fun(1);
/*
fun(1) 根据函数名字 进入到函数内部 执行函数内部的代码
n >= 5 不成立 执行 fun(++n)===》fun(2)
console.log(2) 这条件暂时不执行 需要等待fun(2)函数执行完成
fun(2)
n >= 5 不成立 执行 fun(++n)===》fun(3)
console.log(3) 暂时不执行 需要等待fun(3)函数执行完成
fun(3)
n >= 5 不成立 执行fun(++n) ===》fun(4)
console.log(4) 暂时不执行 需要等待fun(4) 函数执行完成
fun(4)
n >= 5 不成立 执行fun(++n) ===》fun(5)
console.log(5) 暂时不执行 需要等待fun(5) 函数执行完成
fun(5)
n >= 5 成立 执行 return
fun(5)执行完成
console.log(5) 执行完这条代码就说明 fun(4)函数执行完成
console.log(4) 执行完这个条代码说明 fun(3)函数执行完成
console.log(3) 那么 fun(2)函数就会执行完成
console.log(2) 那么fun(1) 函数就会执行完成
*/
//递归调用递归实现循环嵌套 求1!+2!+3!+....+20! 阶乘求和
function fn(n){
if(n==1){
return 1
}
return n* fn(--n)
}
var sum=1;
function fn1(i){
if(i==1){
return 1
}
sum+=fn(i);
fn1(--i);
return sum
}
console.log(fn1(20));