博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
技术 | 前端面试题(一):递归解析
阅读量:5843 次
发布时间:2019-06-18

本文共 992 字,大约阅读时间需要 3 分钟。

递归基本上是一个必考的算法题,它是实现程序计算过程中描述过程的基础模式之一,可见这是极其重要的。前端考察这个的原因,多数是在于看看面试者对于一些基础算法的了解程度,以及思考程度。

 

题目:一个数组“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

 

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

 

我们先从结果来看:

 

  • 如果一个结果已经确定,在第二次调用时是否可以从内存里直接读,而不需要再缓存?

  • 设计好一个简单的Key/Value缓存

  • 在循环时,增加一个条件判断,如果缓存中存在,那么直接从缓存读取结果

 

var resultMap = {}; function fillArrayII(array,result){
   var count = array.length;    var i = 0;    if (!count){
       return []; }    for(;i

 

大家可以看一下优化的结果:

 

 

 

无缓存的420ms,而缓存过的393ms,足足提升了27ms,虽然这个空间不大,但是如果当递归足够深时,可以节省大量的时间。不过缓存,需要对数据结构有一定的设计,这是一个前提。

 

那么除了缓存之外,最常用的优化方式应该算尾递归了,通俗易懂的说,尾递归就是把计算结果放到调用者函数的尾部,顶部的返回值越简单越好,而尾巴的返回可能是越来越复杂的计算。

 

这里只是一个“抛砖引玉”,一般正常情况下递归都可以用迭代来代替。如果你在写完递归之后,再写一个迭代的代替方案,并加以说明,我想你应该会受到青睐。

转载于:https://www.cnblogs.com/Unknw/p/6404022.html

你可能感兴趣的文章
Spring的注解配置与XML配置之间的比较
查看>>
2014手机分析图
查看>>
Linux PID 1 和 Systemd
查看>>
一元多项式相加
查看>>
commandLink/commandButton/ajax backing bean action/listener method not invoked (转)
查看>>
js计算时间差,包括计算,天,时,分,秒
查看>>
使用rsync在windows(服务端)与linux(客户端)之间同步
查看>>
软件工作的大环境
查看>>
vs2013中,自定义mvc 添加视图脚手架
查看>>
移动端Web开发调试之Chrome远程调试(Remote Debugging)
查看>>
Eclipse插件开发中的选择监听机制(Selection Provider-Listener)
查看>>
Java类加载过程及static详解
查看>>
background-color和background-image相关细节
查看>>
如何学好C#
查看>>
梅沙教育APP简单分析-版本:iOS v1.2.21-Nathaneko-佳钦
查看>>
Word中如何设置图片与段落的间距为半行
查看>>
Firefox about
查看>>
Angular - - angular.element
查看>>
美图秀秀首页界面按钮设计(二)
查看>>
nginx安装及负载均衡配置
查看>>