循环 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 url传值中文乱码之解决之道
Nov 20 Javascript
jquery(live)中File input的change方法只起一次作用的解决办法
Oct 21 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
Nov 15 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
Jan 21 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
Dec 20 Javascript
javascript实现俄罗斯方块游戏的思路和方法
Apr 27 Javascript
基于JavaScript代码实现微信扫一扫下载APP
Dec 30 Javascript
理解javascript中的严格模式
Feb 01 Javascript
微信小程序实现留言板(Storage)
Nov 02 Javascript
创建echart多个联动的示例代码
Nov 23 Javascript
vue不操作dom实现图片轮播的示例代码
Dec 18 Javascript
基于react项目打包css引用路径错误解决方案
Oct 28 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
destoon公司主页模板风格的添加方法
2014/06/20 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
2017/02/04 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
Python装饰器的函数式编程详解
2015/02/27 Python
使用Python的PIL模块来进行图片对比
2016/02/18 Python
学习python可以干什么
2019/02/26 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
python写日志文件操作类与应用示例
2019/07/01 Python
django页面跳转问题及注意事项
2019/07/18 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
python如何实现不可变字典inmutabledict
2020/01/08 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
教学实验楼管理制度
2014/02/01 职场文书
工艺工程师岗位职责
2014/03/04 职场文书
基层干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
2014年监理工作总结范文
2014/11/17 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
Pandas-DataFrame知识点汇总
2022/03/16 Python