循环 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压缩混淆工具
May 16 Javascript
动态刷新 dorado树的js代码
Jun 12 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
Jun 19 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
Sep 05 Javascript
使用JavaScript+canvas实现图片裁剪
Jan 30 Javascript
jquery 遍历数组 each 方法详解
May 25 Javascript
canvas绘制的直线动画
Jan 23 Javascript
微信小程序之数据缓存的实例详解
Sep 29 Javascript
Express的HTTP重定向到HTTPS的方法
Jun 06 Javascript
详解关于element el-button使用$attrs的一个注意要点
Nov 09 Javascript
vue项目添加多页面配置的步骤详解
May 22 Javascript
vue实现前端分页完整代码
Jun 17 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
探讨多键值cookie(php中cookie存取数组)的详解
2013/06/06 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
JS跨域代码片段
2012/08/30 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
原生js轮播(仿慕课网)
2017/02/15 Javascript
nodejs 使用http进行post或get请求的实例(携带cookie)
2019/01/03 NodeJs
使用express来代理服务的方法
2019/06/21 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
PHP webshell检查工具 python实现代码
2009/09/15 Python
python缩进区别分析
2014/02/15 Python
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
用python与文件进行交互的方法
2018/03/01 Python
PyCharm安装第三方库如Requests的图文教程
2018/05/18 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
SQL Server面试题
2013/04/04 面试题
金融专业毕业生推荐信
2013/11/26 职场文书
法学院方阵解说词
2014/01/29 职场文书
先进工作者推荐材料
2014/12/23 职场文书
碧霞祠导游词
2015/02/09 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书