递归的学习! xxxxx

2019-05-16  本文已影响0人  不敢大声说话的web小萌新

递归学习

  1. 实现一个输入方法,fun(n) 打印n 直至到n = 0
    function fun(n){
     if(n===1){ return console.log(n) }
     console.log(n);
     fun(n-1);
    }
    
  1. 实现一个递加函数 fun(n),例如 n = 3 ; 1+2+3的结果
    function fun(n){
     if(n === 1){ return 1 }
     return n+fun(n-1);
    }
    
    //尾调优化   尾调-->
    //当函数执行时创建执行栈,上面的代码如果执行5计算的时候
    //那么call task 就会在同一个执行栈 分别调用5 生成 4 调用 4 生产 3 一直到调用到1 然后再返回执行
    //尾调优化就是解决压栈问题 - 让他自身再一个内执行,返回一个函数,不是表达式
    
    function fn(n,total){
     if(n === 1){ return total };
     return fun(n-1,n + total);   
    }
    
    //我们可以做一个console.time()  console.timeEnd() 来测试优化
    
    console.time();
    fun(1000);
    console.timeEnd();
    // default: 0.175048828125ms
    
    console.time();
    fn(1000,1);
    console.timeEnd();
    // default: 0.0498046875ms
    //从这我们看到优化后反而运行时间还会边长,这里我们可以理解到创建执行栈是要消耗时间的
    
    console.time();
    fun(10000);
    console.timeEnd();
    // default: 1.386962890625ms
    
    console.time();
    fn(10000);
    console.timeEnd();
    // default: 0.467041015625ms
    // 从数量上看就可以看出内粗站溢出导致执行复杂度提高!
    
    
  1. 实现一个递乘函数fun(n),例如 n = 3 ; 1 x 2 x 3的结果
    function fun(n){
     if(n === 1){ return 1 }
     return n*fun(n-1);
    }
    
  1. 实现一个阶乘函数fun(x,n),得出x的n次方是的结果
    function fun(x,n){
     if(n===1){ return x }
     return x*fun(x,n-1);
    }
    
  1. 用递归实现一个汉诺塔,fun(n, a, b, c) ,

    什么是汉诺塔 =》 汉诺塔又三根柱子 A ,B ,C A柱子上分别有n个从小到大的圆盘,然后每次只能取一个圆盘,怎么让C柱子跟A柱子一样从小到排列。 B为辅助柱

    function fun(n,a,b,c){
     if(n === 1){ 
            console.log(a + '-->' + c)
        }else{
         fun(n-1,a,c,b);
            console.log(a + '-->' + c);
            fun(n-1,b,a,c);
     }
    }
    

开发时碰见参数数据加密格式必须无限层排序,于是写了一个对象递归!

   function sortObjKey(obj) {
         let newObj = {};
         Object.keys(obj).sort().forEach(item => {
             if (typeof obj[item] === 'object') {
                 if (Array.isArray(obj[item])) {
                     obj[item].forEach(it => {
                         it = sortObjKey(it);
                     })
                 } else {
                     obj[item] = sortObjKey(obj[item]);
                 }
             }
             newObj[item] = obj[item];
         })
         return newObj
     }
     console.log(sortObjKey(obj),'???');
上一篇下一篇

猜你喜欢

热点阅读