JavaScript 递归 作者:马育民 • 2023-10-19 07:47 • 阅读:10066 # 介绍 **递归**:指在当前方法内调用自己的这种现象。 ### 递归的分类 递归分为两种: - 直接递归:称为方法自身调用自己。 - 间接递归:方法之间调用,如:A方法调用B方法,B方法调用C方法,C方法调用A方法。 ### 简单例子 ``` function test(){ console.log("执行test()函数") // 方法递归,自己调用自己 test() } ``` **注意:** 递归有次数限制的,不能太多,否则会报错 ### 例子:递归次数 ``` var i = 1; function test2(){ i++; console.log(i); // 方法递归,自己调用自己,是有次数限制的,不能太多,否则会报错 test2(); } test2() ``` **结论:**递归1万多次就会报错 ### 注意事项 - 递归一定要有 **条件限制**,保证递归能够 **停止下来**,否则会发生栈内存溢出。 - 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。 ### 例子 ``` // 函数调用自己 var i = 1 function test(){ //退出递归的条件 if(i==101){ // break // 停止函数运行,不能用break return // 如果不返回任何值,表示停止函数运行 } console.log("调用函数 test(),i=",i) i++ test() } test() ``` # 递归累加求和 ### 计算1 ~ n的和 **分析**:num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。 **实现代码**: ``` function add(n){ /* num为1时,方法返回1, 相当于是方法的出口,num总有是1的情况 */ if(n==1){ return 1; } /* num不为1时,方法返回 num +(num-1)的累和 递归调用getSum方法 */ return n + add(n-1) } var sum = add(5) console.log(sum) ``` **图解:** [](/upload/0/0/1IX6RVkIY3ns.png) 递归一定要有条件限定,保证递归能够停止下来,次数不要太多,否则会发生栈内存溢出。 # 递归求阶乘 **阶乘**:所有小于及等于该数的正整数的积。 ```java n的阶乘:n! = n * (n-1) *...* 3 * 2 * 1 ``` **分析**:这与累和类似,只不过换成了乘法运算,学员可以自己练习,需要注意阶乘值符合int类型的范围。 ``` 推理得出:n! = n * (n-1)! ``` **代码实现**: ``` function c(n){ if(n == 1){ return 1 } return n * c(n-1) } var result = c(5) console.log("结果:",result) //5*4*3*2*1 ``` # 求阶乘的和 ``` 5!+4!+3!+2!+1! ``` ### 代码实现 ``` function c(n){ if(n == 1){ return 1 } return n * c(n-1) } //5!+4!+3!+2!+1! function sum(n){ if(n == 1){ return 1 } // 5! + 4! + 3! + 2! + 1! return c(n) + sum(n-1) // } var result = sum(5) console.log("结果:",result) ``` 原文出处:http://www.malaoshi.top/show_1IX6RO4bGi1f.html