递归
程序调用自身的编程技巧称为递归( recursion),递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
递归的缺点: 递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等 (溢出指用户实际的数据长度超过了申请的内存空间大小,导致覆盖了其他正常数据,容易造成程序异常,严重的,攻击者可以以此获取程序控制权。泄漏就是内存申请后,用完没有释放,造成可用内存越来越少。)
// 栈溢出 Maximum call stack size exceeded 超过了最大调用堆栈大小, 递归一直循一直生命变量使用栈,把栈的内存用完了,写递归结束条件即可解决此问题
function fn(n){
let result = 1
result = result*fn(n++)
}
function fn(n){
let result = 1;
console.log('result before,,,,', result)
if(n>1){
result = n*fn(n-1) //递 先递下去不出结果,等递到最后一层,再归出结果
}else{
console.log('result middle,,,,', result)
return n; //!!!!!
}
console.log('result after,,,,', result)
return result
}
const a = fn(5)
console.log('result,,,,',a);
result before,,,, 1
result before,,,, 1
result before,,,, 1
result before,,,, 1
result before,,,, 1
result middle,,,, 1
result after,,,, 2
result after,,,, 6
result after,,,, 24
result after,,,, 120
result,,,, 120