循环 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 相关文章推荐
js获取class的所有元素
Mar 28 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
May 11 Javascript
JavaScript提升性能的常用技巧总结【经典】
Jun 20 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
Jul 31 Javascript
vue项目优化之通过keep-alive数据缓存的方法
Dec 11 Javascript
ES6学习笔记之map、set与数组、对象的对比
Mar 01 Javascript
详解Vue中watch的高级用法
May 02 Javascript
用react-redux实现react组件之间数据共享的方法
Jun 08 Javascript
微信小程序的tab选项卡的实现效果
May 15 Javascript
Vue中实现权限控制的方法示例
Jun 07 Javascript
通过layer实现可输入的模态框的例子
Sep 27 Javascript
VueCli生产环境打包部署跨域失败的解决
Nov 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
php cookie 作用范围?不要在当前页面使用你的cookie
2009/03/24 PHP
php的ddos攻击解决方法
2015/01/08 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
javascript function调用时的参数检测常用办法
2010/02/26 Javascript
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
2015/07/31 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
layer弹出层全屏及关闭方法
2018/08/17 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
简单谈谈Python中的闭包
2016/11/30 Python
Python不使用int()函数把字符串转换为数字的方法
2018/07/09 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
tensorboard显示空白的解决
2020/02/15 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
python中子类与父类的关系基础知识点
2021/02/02 Python
HTML5和CSS3实例教程总结(推荐)
2016/07/18 HTML / CSS
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
我的applet原先好好的, 一放到web server就会有问题,为什么?
2016/05/10 面试题
丧事主持词大全
2014/04/02 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript