循环 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 相关文章推荐
javascript 精粹笔记
May 09 Javascript
jQuery学习笔记 获取jQuery对象
Sep 19 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
Apr 12 Javascript
JavaScript列表框listbox全选和反选的实现方法
Mar 18 Javascript
基于jQuery实现响应式圆形图片轮播特效
Nov 25 Javascript
jQuery版本升级踩坑大全
Jan 12 Javascript
JS实现六位字符密码输入器功能
Aug 19 Javascript
判断js的Array和Object的实现方法
Aug 29 Javascript
详解js前端代码异常监控
Jan 11 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
Nov 06 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
Jan 07 Javascript
bootstrap-paginator服务器端分页使用方法详解
Feb 13 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
Could not load type System.ServiceModel.Activation.HttpModule解决办法
2012/12/29 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
8个必备的PHP功能开发
2015/10/02 PHP
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
js控制页面控件隐藏显示的两种方法介绍
2013/10/09 Javascript
JQUERY dialog的用法详细解析
2013/12/19 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
EasyUI Combobox设置默认值 获取text的方法
2016/11/28 Javascript
JS正则表达式判断有效数实例代码
2017/03/13 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
JavaScript中Require调用js的实例分享
2017/10/27 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
python executemany的使用及注意事项
2017/03/13 Python
python并发编程之线程实例解析
2017/12/27 Python
python日志模块logbook使用方法
2019/09/19 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
PHP经典面试题
2016/09/03 面试题
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
什么是Rollback Segment
2013/04/22 面试题
小学生读书感言
2014/02/12 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
俄语专业毕业生求职信
2014/07/12 职场文书
施工单位安全责任书
2014/07/24 职场文书
同意转租证明
2015/06/24 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL