介绍
递归:指在当前方法内调用自己的这种现象。
递归的分类
- 递归分为两种,直接递归和间接递归。
- 直接递归称为方法自身调用自己。
- 间接递归可以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)
图解:
递归一定要有条件限定,保证递归能够停止下来,次数不要太多,否则会发生栈内存溢出。
递归求阶乘
阶乘:所有小于及等于该数的正整数的积。
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)