循环 vs 递归浅谈


Posted in Javascript onFebruary 28, 2013

比如遍历以下一维数组:

[javascript] view plaincopyprint?
var a1 = [1];  
var a2 = [1, 2];  
var a3 = [1, 2, 3]; 

虽然它们长度不一,但循环应付它们非常容易,也很优雅:

[javascript] view plaincopyprint?
var dumpArrayByLoop = function(a) {  
    for (var i = 0; i < a.length; i++) {  
        println(a[i]);  
    }  
}; 

如果改用递归,则看起来比较别扭:

[javascript] view plaincopyprint?
var dumpArrayByRecur = function(i, a) {  
    if (i < a.length) {  
        println(a[i]);  
        dumpArrayByRecur(i + 1, a);  
    }  
}; 

它们能输出同样的结果,但相比之下递归版本看起来很笨拙。

现在想想,如果元数据变化了:维度扩大到二维。

[javascript] view plaincopyprint?
var a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; 

此时需要再外面再套一层循环变成双重循环:

[javascript] view plaincopyprint?
var dumpArrayByLoop = function(a) {  
    for (var i = 0; i < a.length; i++) {  
        for (var j = 0; j < a[i].length; j++) {  
            println(a[i][j]);  
        }  
    }  
}; 

如果数据的维度再继续扩大,变成三维、四维……甚至动态的N维数组。使用循环该怎么处理呢?

在这种“层数”很深,甚至不确定的情况下,就需要用“递归”来解决跨“层”的问题。

[javascript] view plaincopyprint?
var isArray = function(a) {  
    return Object.prototype.toString.call(a) === '[object Array]';  
};  var dumpArrayByRecur = function(a) {  
    if (isArray(a)) {  
        for (var i = 0; i < a.length; i++) {  
            dumpArray(a[i]);  
        }  
    } else {  
        println(a);  
    }  
}; 

上面的代码中,如果发现子节点是一个数组,就使用递归进入下一层;而同一层上的遍历则使用循环来完成。

Javascript 相关文章推荐
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
Apr 18 Javascript
JQuery解析XML数据的几个简单实例
May 18 Javascript
JS模态窗口返回值兼容问题的完美解决方法
May 28 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
Aug 18 Javascript
jquery动态添加文本并获取值的方法
Oct 12 Javascript
js中数组插入、删除元素操作的方法
Feb 15 Javascript
js使用i18n实现页面国际化的方法
May 09 Javascript
利用Decorator如何控制Koa路由详解
Jun 26 Javascript
vue elementUI tree树形控件获取父节点ID的实例
Sep 12 Javascript
使用vuex解决刷新页面state数据消失的问题记录
May 08 Javascript
Js图片点击切换轮播实现代码
Jul 27 Javascript
如何在vue中使用HTML 5 拖放API
Jan 14 Vue.js
JavaScript对象创建及继承原理实例解剖
Feb 28 #Javascript
jquery显示和隐藏div特效实例
Feb 27 #Javascript
JS等比例缩小图片尺寸的实例
Feb 27 #Javascript
JQuery切换显示的效果实例代码
Feb 27 #Javascript
innerText和textContent对比及使用介绍
Feb 27 #Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
Feb 26 #Javascript
jQuery easyui datagrid动态查询数据实例讲解
Feb 26 #Javascript
You might like
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
jQuery实现的立体文字渐变效果
2010/05/17 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
jQuery获得document和window对象宽度和高度的方法
2015/03/25 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
Nodejs下用submit提交表单提示cannot post错误的解决方法
2016/11/21 NodeJs
BootStrap学习笔记之nav导航栏和面包屑导航
2017/01/03 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
Django中ORM外键和表的关系详解
2019/05/20 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
如何解决安装python3.6.1失败
2020/07/01 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
三星美国官网:Samsung美国
2017/02/06 全球购物
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
魅力教师事迹材料
2014/01/10 职场文书
社区义诊活动总结
2014/04/30 职场文书
费用申请报告范文
2015/05/15 职场文书
新郎结婚感言
2015/07/31 职场文书
2016读书月活动心得体会
2016/01/14 职场文书