1.递归的概念
在程序中函数直接或间接调用自己
注意: 使用递归函数一定要注意,处理不当就会进入死循环,递归一定要有结束的条件。递归函数只有在特定的情况下使用 ,比如阶乘问题。
2.递归的例子
(一)递归实现:求1~5之间的和
//函数声明
function getSum(x) {
//结束条件
if(x==1){
return 1;
}
return x + getSum(x-1);
}
//函数的调用
console.log(getSum(5));
执行过程:
- 代码执行getSum(5)—>进入函数,此时的x是5,执行的是5+getSum(4),此时代码等待,5+getSum(4)这句代码先不进行计算,先执行getSum(4);
- 代码执行getSum(4)—> 进入函数, 执行的是4+getSum(3),代码等待, 先执行的是getSum(3);
- 代码执行getSum(3)—>进入函数,执行的是3+getSum(2),代码等待,先执行的是getSum(2);
- 代码执行getSum(2)—>进入函数,执行的是2+getSum(1),代码等待, 先执行的是getSum(1),此时x == 1了,执行的是x ==1的判断,return 1,
- 此时getSum(1)的结果是1,开始向外走出去
2+getSum(1) 此时的结果是:2+1
也就是getSum(2) = 2+1
然后执行3+getSum(2) 此时的结果是:3+2+1
4+getSum(3) 此时的结果是:4+3+2+1
5+getSum(4) 此时的结果是:5+4+3+2+1 结果为15
(二):求一个数字各个位数上的数字的和
function getEverySum(x) {
//结束条件
if (x < 10) {
return x;
}
//获取的是这个数字的个位数
return x % 10 + getEverySum(parseInt(x / 10));
}
console.log(getEverySum(1364));
步骤分析
- x = 1364,进入函数,不满足结束的条件,继续执行下一步,x % 10得到的是个位上的数字,1364 % 10取余得到的是个位数字4;得到4 + getEverySum(parseInt(1364 / 10)),此时代码等待,4 + getEverySum(parseInt(1364 / 10))这句代码先不进行计算,先执行getEverySum(parseInt(1364 / 10));parseInt(1364 / 10) = 136,得到x = 136;
- 代码执行getEverySum(136),x=136,进入函数,不满足结束的条件,继续执行下一步, x % 10得到的还是个位上的数字,136 % 10取余得到的是个位数字6;得到6 + getEverySum(parseInt(136 / 10)),此时代码等待,6 + getEverySum(parseInt(136 / 10))这句代码先不进行计算,先执行getEverySum(parseInt(136 / 10));parseInt(136 / 10) = 13,得到x = 13;
- 以此类推,最后得出4 + 6 + 3 + 1 = 14
(三)求Fibonacci数列(斐波那契数列)
1,1,2,3,5,8,13,21,34,55,89...求第 12 项
function getFib(x) {
//结束条件
if (x == 1 || x == 2) {
return 1;
}
//在这里函数重复调用,直到满足结束条件为止
return getFib(x - 1) + getFib(x - 2);
}
console.log(getFib(12));