JavaScript随笔——递归

什么是递归?

程序调用自身的编程技巧称为递归( recursion)。归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量 。

递归的能力在于用有限的语句来定义对象的无限集合

一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。


 

递归例子:

1、 求和 1...1000

function getSum(num) {
         if(num === 1) {
             return num
         } else {
             // return num + getSum(num - 1) // 如果 var getterSum = getSum, getSum = null 会报错
             return num + arguments.callee(num - 1)
         }
     }
const value = getSum(1000)

console.log(value)

2、 奇数项求和

    function foo(n){
        if(n == 0) return 1;
        return foo(n-1) + 2;
    }

    function sum(n){
        if(n == 0) return 1;
        return foo(n) + sum(n-1);
    }

    console.log(sum(0)) // 1  0是指从第零项(1)开始

3、偶数项求和

// 第0项为2,第1项为4···
function fn(n){
    if(n == 0) return 2;
    return fn(n-1) + 2;
}
function sum(n){
    if(n==0) return 2;
    return fn(n) + sum(n-1);
}
console.log(sum(0)) // 2  0是指从第零项(2)开始

4、尾递归

函数在尾部调用自身就成为尾递归

function factorial(n) {
            if(n === 1) return n
            return n * factorial(n - 1)
        }
        // 计算n的阶乘,最多需要保存n个调用记录,复杂度为O(n)
        console.time(1)
        console.log(factorial(5)) // 120
        console.timeEnd(1) // 1: 1.60400390625ms

        // 如果改为尾递归,只需要保留一个调用记录,复杂度为O(1)
        function factorial01(n, tntal) {
            if(n === 1) return tntal
            return factorial(n - 1, n * tntal)
        }
        console.time(2)
        console.log(factorial01(5, 1)) // 120
        console.timeEnd(2) // 2: 0.14404296875ms

 

posted @ 2020-09-01 23:02  oilweng  阅读(122)  评论(0)    收藏  举报