什么是递归?
简单来说,就是在函数内部嵌套自身这个函数。
function fib(n){
fib(n);
}
假设现在必须要执行 fib,单就上述情况而言,它会一直执行下去。因此,每个递归函数必须要有边界条件(跳出递归)。
下面会结合几个案例帮助大家去理解递归。
例如:要计算1到100的和。
(1)通常会用for循环计算
function fn(n){
var sum=0;
for(let i=1;i<=n;i++){
sum +=i;
}
return sum;
}
console.log( fn(100) );//5050
(2)用递归计算1到100的和
function fn(n){
if(n===1) return 1;//确认边界条件,当n=1的时候,返回值1,fn(1)=1
return n+fn(n-1);/*嵌套:fn(n)=n+fn(n-1),例如:计算fn(10)=?,
那么fn(10)=10+fn(9),所以 fn(9)=9+fn(8),而 fn(8)=8+fn(7).......一直到
最后计算 fn(2)=2+fn(1), 当n=1时,跳出递归,将1返回给fn(1),所以就会
依次得到fn(2)、fn(3)、fn(4)......fn(10)的值。*/
}
console.log( fn(100) );//5050
(3)同样的规律计算n的阶乘
function getNum(n){
if(n===1) return 1;//确认边界条件,跳出递归
return n*getNum(n-1);
}
console.log(getNum(5) );//120
console.log(getNum(6) );//720
console.log(getNum(7) );//5040
console.log(getNum(8) );//40320
(4)计算斐波那契第n项的值
function fib(n){
if(n===1 || n===2) return 1;//1、1、2、3、5、8、13、21、34、55
return fib(n-1)+fib(n-2);
}
console.log(fib(7) );//13
console.log(fib(8) );//21
console.log(fib(9) );//34
console.log(fib(10) );//55
console.log(fib(18) );//2584