循环 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下查找父节点的简单方法
Aug 13 Javascript
ie支持function.bind()方法实现代码
Dec 27 Javascript
js实现倒计时时钟的示例代码
Dec 17 Javascript
javascript同步服务器时间和同步倒计时小技巧
Sep 24 Javascript
jQuery EasyUI Dialog拖不下来如何解决
Sep 28 Javascript
javascript函数中的3个高级技巧
Sep 22 Javascript
jQuery EasyUI Panel面板组件使用详解
Feb 28 Javascript
Vue组件之极简的地址选择器的实现
May 31 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
Jan 10 Javascript
使用jquery的cookie实现登录页记住用户名和密码的方法
Mar 13 jQuery
微信小程序网络层封装的实现(promise, 登录锁)
May 08 Javascript
vue 页面回退mounted函数不执行的解决方案
Jul 26 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
解析PHP中如何将数组变量写入文件
2013/06/06 PHP
php递归json类实例
2014/12/02 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
文字幻灯片
2006/06/26 Javascript
用一段js程序来实现动画功能
2007/03/06 Javascript
DHTML Slide Show script图片轮换
2008/03/03 Javascript
jquery autocomplete自动完成插件的的使用方法
2010/08/07 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
javascript数组去重小结
2016/03/07 Javascript
AngularJS入门教程之路由与多视图详解
2016/08/19 Javascript
浅析JavaScript中break、continue和return的区别
2016/11/30 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
js实现动态显示时间效果
2017/03/06 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
react配置antd按需加载的使用
2019/02/11 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
JavaScript常用工具函数库汇总
2020/09/17 Javascript
python调用fortran模块
2016/04/08 Python
python线程中同步锁详解
2018/04/27 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
西班牙第一的网上药房:PromoFarma.com
2017/04/17 全球购物
世界上最大的皮肤科医生拥有和经营的美容网站:LovelySkin
2021/01/03 全球购物
介绍一下linux文件系统分配策略
2012/11/17 面试题
高一生物教学反思
2014/01/17 职场文书
英语专业职业生涯规划范文
2014/03/05 职场文书
2015年师德师风承诺书
2015/01/22 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL