循环 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 相关文章推荐
使用Modello编写JavaScript类
Dec 22 Javascript
jquery中获取select选中值的代码
Jun 27 Javascript
jQuery 选择器详解
Jan 19 Javascript
JavaScript事件委托技术实例分析
Feb 06 Javascript
javascript实现实时输出当前的时间
Apr 27 Javascript
JS实现上下左右对称的九九乘法表
Feb 22 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
Oct 11 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
May 11 Javascript
vue router2.0二级路由的简单使用
Jul 05 Javascript
使用vue-router为每个路由配置各自的title
Jul 30 Javascript
Vue插件之滑动验证码用法详解
Apr 05 Javascript
javascript实现智能手环时间显示
Sep 18 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笔记 字符串处理
2010/10/19 PHP
打造超酷的PHP数据饼图效果实现代码
2011/11/23 PHP
php摘要生成函数(无乱码)
2012/02/04 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
IE php关于强制下载文件的代码
2008/08/23 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
Python psutil模块简单使用实例
2015/04/28 Python
python中关于for循环的碎碎念
2017/06/30 Python
Python实现购物车功能的方法分析
2017/11/10 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
Python调用C语言的实现
2019/07/26 Python
python自动结束mysql慢查询会话的实例代码
2019/10/27 Python
Python实现图像的垂直投影示例
2020/01/17 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
jupyter notebook 实现matplotlib图动态刷新
2020/04/22 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
2020/07/13 Python
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
出纳试用期自我鉴定
2014/04/07 职场文书
募捐感谢信
2015/01/22 职场文书
特此通知格式
2015/04/27 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
小学校本教研总结
2015/08/13 职场文书
宝宝满月宴答谢词
2015/09/30 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书