循环 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 盒模型 尺寸深入理解
Dec 31 Javascript
JavaScript实现关键字高亮功能
Nov 12 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
Aug 11 Javascript
jQuery实现下拉框功能实例代码
May 06 Javascript
AngularJS过滤器filter用法实例分析
Nov 04 Javascript
js 数字、字符串、布尔值的转换方法(必看)
Apr 07 Javascript
JavaScript 巧学巧用
May 23 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
Jun 16 Javascript
详解使用webpack打包编写一个vue-toast插件
Nov 08 Javascript
JavaScript继承与多继承实例分析
May 26 Javascript
jQuery使用动画队列自定义动画操作示例
Jun 16 jQuery
angularjs的单选框+ng-repeat的实现方法
Sep 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
详解PHP中的Traits
2015/07/29 PHP
php cookie 详解使用实例
2016/11/03 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
JavaScript版代码高亮
2006/06/26 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
值得分享的Bootstrap Table使用教程
2016/11/23 Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
2017/01/18 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
使用vue-infinite-scroll实现无限滚动效果
2018/06/22 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
开发Node CLI构建微信小程序脚手架的示例
2020/03/27 Javascript
[52:57]2014 DOTA2国际邀请赛中国区预选赛 LGD-CDEC VS HGT
2014/05/21 DOTA
Python中文字符串截取问题
2015/06/15 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
在Python中使用Neo4j的方法
2019/03/14 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
党性教育心得体会
2014/09/03 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
先进个人总结范文
2015/02/15 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书
三年级作文之趣事作文
2019/11/04 职场文书