递归

递归

递归基础知识

​ 递归可以看做函数在运行过程中中,是自己调用自己,如下图所示:

var obj={value:1,next:{value:2,next:{value:3,next:{value:4,next:{value:5,next:null}}}}};

      function fn1(obj){
          console.log(obj.value);
          if(obj.next) fn1(obj.next);
      }

      fn1(obj);

​ 函数在没有完全执行时,内部的所有变量都不会被销毁。

​ 递归会建立一个函数的副本,在堆中建立相同的函数引用,递归调用时调用这个函数引用。

var i=0;
      function fn1(){
          var a=3;
          i++;
         if(i<3) fn2();
         console.log(i);//最后打印的
      }

      function fn2(){
          var a=3;
          i++;
         if(i<3) fn3();
         console.log(i);//第二个被打印的
      }

      function fn3(){
          var a=3;
          i++;
         console.log(i);//最先打印的
      }

      fn1();

      var i=0;
      function fn1(){
          var a=3;
          i++;
         if(i<12000) fn1();
         console.log(i);//最后打印的
      }

      fn1();

递归的应用

​ 用于对象的深查找:遍历对象,查找对象中是否有属性值为value的属性,并返回对象的属性

function fn3(o,value){
         for(var prop in o){
             if(o[prop]===value) return prop;
             if(typeof o[prop]==="object" && o[prop]!==null){
                var s=fn3(o[prop],value)
                if(s) return s;
             }
         }
      }

​ 用于实现对象的深度遍历(也就是深复制):就是对于对象的属性中也是存储的对象类型的元素都遍历,将原对象的属性值都复制给新对象,原对象和新对象的引用关系不相同,只是属性值相同。

function fn1(source,target){
          if(target===undefined) target={};
            for(var prop in source){   
              // console.log(prop);
                if(typeof source[prop]==="object" && source[prop]!==null){
                  target[prop]={};
                  // 如果不加的话,引用关系会发生改变
                  fn1(source[prop],target[prop])
                }
                else {
                  target[prop]=source[prop];
                }
            }
            return target;
        }

​ 对象的广度遍历用的是for in语句:语句如下图所示:

function fn1(obj){
            for(var prop in obj){
                console.log(prop,obj[prop]);
                if(typeof obj[prop]==="object" && obj[prop]!==null) fn1(obj[prop])
            }
        }

        fn1(obj);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值