循环 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 对象、函数和继承
Jul 07 Javascript
基于jquery的cookie的用法
Jan 10 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
Oct 12 Javascript
JS中把字符转成ASCII值的函数示例代码
Nov 21 Javascript
JS动态增加删除UL节点LI及相关内容示例
May 21 Javascript
JS小游戏之仙剑翻牌源码详解
Sep 25 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
May 04 Javascript
微信小程序实现默认第一个选中变色效果
Jul 17 Javascript
Node.js API详解之 module模块用法实例分析
May 13 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
Oct 29 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
Nov 03 Javascript
JavaScript异步操作中串行和并行
Nov 20 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 post大量数据时发现数据丢失问题解决方法
2015/06/20 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
thinkphp实现图片上传功能
2016/01/13 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
js控制CSS样式属性语法对照表
2012/12/11 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
2015/08/28 Javascript
基于Node的React图片上传组件实现实例代码
2017/05/10 Javascript
详解react-refetch的使用小例子
2019/02/15 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
js实现简单选项卡制作
2020/08/05 Javascript
javascript实现图片轮换动作方法
2020/08/07 Javascript
使用Mock.js生成前端测试数据
2020/12/13 Javascript
python进阶教程之动态类型详解
2014/08/30 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
python根据文章标题内容自动生成摘要的实例
2019/02/21 Python
python简单实现AES加密和解密
2019/03/28 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
django 简单实现登录验证给你
2019/11/06 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
Python列表解析操作实例总结
2020/02/26 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
2020/02/28 Python
德国街头和运动文化高品质商店:BSTN Store
2017/08/26 全球购物
毕业生个人的求职信范文
2013/12/03 职场文书
企业节能减排实施方案
2014/03/19 职场文书
学生保证书范文
2014/04/28 职场文书
2016年优秀党员教师先进事迹材料
2016/02/29 职场文书
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
mysql的Buffer Pool存储及原理
2022/04/02 MySQL
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL