美文网首页
递归解析

递归解析

作者: 小小的白菜 | 来源:发表于2018-10-05 23:48 被阅读0次

递归解析

题目:一个数组var meta = [1,2,[3,4,[5]],6,[7,[8,9,[10,11,[12]]]]];,通过递归的方式依次取出这个数组中的数据。

  • 最简单的方式是设定一个函数,传入这个数组,然后判断其中的值是否为数组。
  • 如果为数组,那么继续调用当前的函数,将这个值传入。
  • 如果不为数组,那么就将值return出来,或者push到某个新数组里。
function fillArray(array, result) {
    var count = array.length;
    var i = 0;
    for (; i < count; ++i) {
      var temp = array[i];
      if (Array.isArray(temp)) {
        fillArray(temp, result);
      } else {
        result.push(array[i]);
      }
    }
  }

  var result = [];
  fillArray(meta, result);
  // 递归的结果console.log('递归处理的结果:',result);

显然上述不是一个最优的答案,这个时候,面试官想要看的可能就是你主动思考的能力了,想一想,这个是不是可以优化一下,如果可以怎么办?

我们先从结果来看:

  • 如果一个结果已经确定,在第二次调用时是否可以从内存里直接读,而不需要再缓存?
  • 设计好一个简单的Key/Value缓存;
  • 在循环时,增加一个条件判断,如果缓存中存在,那么直接从缓存读取结果。
 var resultMap = {};
  var meta = [1, 2, [3, 4, [5]], 6, [7, [8, 9, [10, 11, [12]]]]];

  function fillArrayII(array, result) {
    var count = array.length;
    var i = 0;
    if (!count) {
      return [];
    }
    for (; i < count; ++i) {
      var temp = array[i];
      var g = resultMap[temp];
      if (g) {
        result.push(g);
      } else {
        if (Array.isArray(temp)) {
          fillArrayII(temp, result);
        } else {
          resultMap[temp] = temp
          result.push(temp);
        }
      }
    }
  }

  var date1 = new Date();
  var time1 = date1.getTime();
  var r = [];
  fillArrayII(meta, r);
  console.log(r);
  var date2 = new Date();
  var time2 = date2.getTime();
  console.log('no cache time : ', time2 - time1);
  var date3 = new Date();
  var time3 = date3.getTime();
  var f = [];
  fillArrayII(meta, f);
  console.log(f)
  var date4 = new Date();
  var time4 = date4.getTime();
  console.log('cache time : ', time4 - time3);

相关文章

  • DNS解析原理:递归 VS 迭代

    DNS 解析分类 DNS解析流程分为递归查询和迭代查询,递归查询是以本地名称服务器为中心查询, 递归查询是默认方式...

  • 递归解析

    递归解析 题目:一个数组var meta = [1,2,[3,4,[5]],6,[7,[8,9,[10,11,[1...

  • 二叉树算法之0-计算二叉树的深度

    算法思想:使用递归 算法解析:分别递归左树和右树,递归到叶子节点时返回0,递归回溯时值+1,不断累积回溯的深度,每...

  • llvm cookbook 2.4 实现parser

    本文实现一个自顶向下的解析。 递归构造AST:

  • 递归的解析

    解释:程序调用自身的编程技巧叫做递归。 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在...

  • RuntimeError: maximum recursion

    递归深度报错 最近在写一些爬虫,按照URL获取html解析,成功后递归: 例:请求def get_detail(m...

  • 二叉树算法之1-计算二叉树第k层节点个数

    算法思想:递归 算法解析:把k作为计数器通过参数递归传递,递归的过程中不断减1,直到k==0时说明找到一条从根节点...

  • 在浏览器输入url,按下回车后究竟发生了什么

    1、浏览器通过DNS将url地址解析为ip(如果有缓存直接返回缓存,否则递归解析) 2、通过DNS解析得到了目标服...

  • JAVA 递归解析xml

    来源:http://itssh.cn/post/905.html 在日常开发中经常碰到xml解析,现提供递归解析x...

  • Webpack的一些优化

    缩小文件搜索范围 Webpack从Entry出发递归解析导入语句寻找相应的依赖,在项目庞大的时候,文件量大增,递归...

网友评论

      本文标题:递归解析

      本文链接:https://www.haomeiwen.com/subject/vmrcaftx.html