递归

递归求斐波那契数列:

    //1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........
    function getFib(n){
        if(n==1 || n==2){
            return 1;
        }
        return getFib(n-1)+getFib(n-2);
    }
    console.log(getFib(1))  //1
    console.log(getFib(2))  //1
    console.log(getFib(3))  //2
    console.log(getFib(4))  //3
    console.log(getFib(9))  //34
    console.log(getFib(50)) //卡死

原因是这样算比较浪费性能。

    let i=0; //计数
    function getFib(n){
        i++;
        if(n==1 || n==2){
            return 1;
        }
        return getFib(n-1)+getFib(n-2);
    }
    console.log(getFib(20))     //6765
    console.log(i)      //13529

由此可见,求第20位的数字,浏览器计算了13529次。

改进如下:

    let i=0,
        obj={};
    function getFib(n){
        i++;
        if(obj[n] != undefined){  // 如果obj里已经有这个数,那么直接返回这个数
            return obj[n];
        }else{  // 如果obj里没有这个数,则进行计算
            if(n==1 || n==2){
                obj[n]=1;
                return 1;
            }else{
                obj[n]=getFib(n-1)+getFib(n-2);
                return obj[n];
            }
        }
    }
    console.log(getFib(60)) // 1548008755920
    console.log(obj)
    console.log(i)  // 117

 

递归求阶乘:

    function fn(n){
        if(n==1){
            return 1;
        }else{
            return fn(n-1)*n;
        }
    }
    console.log(fn(1))  //1
    console.log(fn(2))  //1*2
    console.log(fn(3))  //1*2*3
    console.log(fn(4))  //1*2*3*4
    console.log(fn(5))  //1*2*3*4*5

 

posted @ 2019-11-20 21:25  吴小明-  阅读(134)  评论(0编辑  收藏  举报