循环 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 相关文章推荐
jQuery Clone Bug解决代码
Dec 22 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
Sep 21 Javascript
浅谈关于JavaScript的语言特性分析
Apr 11 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
Nov 15 Javascript
jQuery控制div实现随滚动条滚动效果
Jun 07 Javascript
Bootstrap多级菜单的实现代码
May 23 Javascript
react.js使用webpack搭配环境的入门教程
Aug 14 Javascript
谈谈JS中的!!
Dec 07 Javascript
node.js ws模块搭建websocket服务端的方法示例
Apr 25 Javascript
VUE实现图片验证码功能
Nov 18 Javascript
深入理解 ES6中的 Reflect用法
Jul 18 Javascript
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
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
简单易用的计数器(数据库)
2006/10/09 PHP
php array_merge下进行数组合并的代码
2008/07/22 PHP
php at(@)符号的用法简介
2009/07/11 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
js动态给table添加/删除tr的方法
2013/08/02 Javascript
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
提高jQuery性能的十个诀窍
2013/11/14 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
jQuery实现图片文字淡入淡出效果
2015/12/21 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
nodeJS实现路由功能实例代码
2017/06/08 NodeJs
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
Python3爬虫中关于Ajax分析方法的总结
2020/07/10 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
python 利用jieba.analyse进行 关键词提取
2020/12/17 Python
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
绘画设计学生的个人自我评价
2013/09/20 职场文书
物理专业本科生自荐信
2014/01/30 职场文书
前厅收银主管岗位职责
2014/02/04 职场文书
大二学生职业生涯规划书
2014/02/05 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
《乌鸦喝水》教学反思
2016/02/19 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python