• 递归


    1.递归

    1.1什么是递归

    递归:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。简单理解:函数内部自己调用自己, 这个函数就是递归函数

     <script>
            //递归函数:函数内部自己调用自己,这个函数就是递归函数
            var num = 1;
    ​
            function fn() {
                console.log('我要打印六次');
                if (num == 6) {
                    return; // 递归函数一定要有退出
                }
                num++;
                fn();
            }
            fn();
        </script>

    注意:递归函数的作用和循环效果一样,由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件return。

    1.2利用递归求1~n的阶乘

     <script>
            //利用递归函数求1~n的阶乘1 *2*3*4*..n
            function fn(n) {
                if (n == 1) {
                    return 1;
                }
                return n * fn(n - 1);
            }
            console.log(fn(3));
            //详细思路假如用户输入的是3
            //return 3 * fn(2)
            //return 3 * (2 *fn(1))
            //return 3 * (2 * 1)
            //return 3 * (2)
            //return 6
        </script>

    1.3利用递归求斐波那契数列

    <script>
            //利用递归函数求斐波那契数列(兔子序列)1、1、2、3、5、8、13、21...
            //用户输入一个数字n就可以求出这个数字对应的兔子序列值
            //我们只需要知道用户输入的n的前面两项(n-1 n-2)就可以计算出n对应的序列值
            function fb(n) {
                if (n == 1 || n == 2) {
                    return 1;
                }
                return fb(n - 1) + fb(n - 2);
            }
            console.log(fb(6));
            console.log(fb(7));
        </script>

    1.4利用递归遍历数据

    // 我们想要做输入id号,就可以返回的数据对象
     var data = [{
       id: 1,
       name: '家电',
       goods: [{
         id: 11,
         gname: '冰箱',
         goods: [{
           id: 111,
           gname: '海尔'
         }, {
           id: 112,
           gname: '美的'
         },
    ​
                ]
    ​
       }, {
         id: 12,
         gname: '洗衣机'
       }]
     }, {
       id: 2,
       name: '服饰'
    }];
    //1.利用 forEach 去遍历里面的每一个对象
     function getID(json, id) {
       var o = {};
       json.forEach(function(item) {
         // console.log(item); // 2个数组元素
         if (item.id == id) {
           // console.log(item);
           o = item;
           return o;
           // 2. 我们想要得里层的数据 11 12 可以利用递归函数
           // 里面应该有goods这个数组并且数组的长度不为 0 
         } else if (item.goods && item.goods.length > 0) {
           o = getID(item.goods, id);
         }
       });
       return o;
    }

    2.深拷贝和浅拷贝

    浅拷贝

     <script>
            //浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用.
            //深拷贝拷贝多层,每一级别的数据都会拷贝.
            var sq = {
                uname: 'andy',
                age: 18,
                msag: {
                    num: 20
                }
            }
            var o = {};
            Object.assign(o, sq);
            o.msag.num = 250;
            console.log(o);
        </script>

    深拷贝

     <script>
            // 深拷贝拷贝多层, 每一级别的数据都会拷贝.
            var obj = {
                id: 1,
                name: 'andy',
                msg: {
                    age: 18
                },
                color: ['pink', 'red']
            };
            var o = {};
            // 封装函数 
            function deepCopy(newobj, oldobj) {
                for (var k in oldobj) {
                    // 判断我们的属性值属于那种数据类型
                    // 1. 获取属性值  oldobj[k]
                    var item = oldobj[k];
                    // 2. 判断这个值是否是数组
                    if (item instanceof Array) {
                        newobj[k] = [];
                        deepCopy(newobj[k], item)
                    } else if (item instanceof Object) {
                        // 3. 判断这个值是否是对象
                        newobj[k] = {};
                        deepCopy(newobj[k], item)
                    } else {
                        // 4. 属于简单数据类型
                        newobj[k] = item;
                    }
    
                }
            }
            deepCopy(o, obj);
            console.log(o);
    
            var arr = [];
            console.log(arr instanceof Object);
            o.msg.age = 20;
            console.log(obj);
        </script>
  • 相关阅读:
    异步任务AsyncTask
    巧用TextView实现分隔线
    android系统的常用权限
    浅析对话框AlertDialog
    LinearLayout中的layout_weight属性详解
    CLOB大数据对象
    模糊查询demo
    ES6 箭头函数
    ES6中数组求和,求平均数方法( reduce )
    ES6中数组方法( every 和 some )
  • 原文地址:https://www.cnblogs.com/bky-/p/13830122.html
Copyright © 2020-2023  润新知