JavaScript 递归

介绍

递归:指在当前方法内调用自己的这种现象。

递归的分类

  • 递归分为两种,直接递归和间接递归。
  • 直接递归称为方法自身调用自己。
  • 间接递归可以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)

原文出处:http://www.malaoshi.top/show_1IX6RO4bGi1f.html