循环 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 相关文章推荐
兼容ie和firefox js关闭代码
Dec 11 Javascript
小试JQuery的AutoComplete插件
May 04 Javascript
js给onclick事件赋值,动态传参数实例解说
Mar 28 Javascript
简单方法判断JavaScript对象为null或者属性为空
Sep 26 Javascript
JavaScript使用Replace进行字符串替换的方法
Apr 14 Javascript
理解AngularJs指令
Dec 10 Javascript
javascript获取网页各种高宽及位置的方法总结
Jul 27 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
Nov 04 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
Nov 24 Javascript
@angular前端项目代码优化之构建Api Tree的方法
Dec 24 Javascript
vue实现全匹配搜索列表内容
Sep 26 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
Feb 12 Javascript
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
DISCUZ 分页代码
2007/01/02 PHP
PHP与MySQL开发中页面乱码的产生与解决
2008/03/27 PHP
改变Apache端口等配置修改方法
2008/06/05 PHP
解析PHP工厂模式的好处
2013/06/18 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
ExtJs 3.1 XmlTreeLoader Example Error
2010/02/09 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
原生js实现淘宝购物车功能
2020/06/23 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
2017/02/13 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
vue实现微信获取用户信息的方法
2019/03/21 Javascript
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
Python操作MySQL数据库9个实用实例
2015/12/11 Python
Linux下将Python的Django项目部署到Apache服务器
2015/12/24 Python
python PIL模块与随机生成中文验证码
2016/02/27 Python
Zabbix实现微信报警功能
2016/10/09 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
python自动发微信监控报警
2019/09/06 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
Under Armour安德玛意大利官网:美国高端运动科技品牌
2020/01/16 全球购物
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
实习生自荐信范文分享
2013/11/27 职场文书
报到证丢失证明
2014/01/11 职场文书
数学教师个人总结
2015/02/06 职场文书
会议主持词结束语
2015/07/03 职场文书
九年级语文教学反思
2016/03/03 职场文书