循环 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 IE 与 FF中兼容问题小结
Feb 18 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
Feb 28 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
Jun 11 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
Jul 27 Javascript
jquery ajax分页插件的简单实现
Jan 27 Javascript
由浅入深剖析Angular表单验证
Jul 14 Javascript
jQuery增加、删除及修改select option的方法
Aug 19 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
Jun 09 jQuery
Spring Boot/VUE中路由传递参数的实现代码
Mar 02 Javascript
了解在JavaScript中将值转换为字符串的5种方法
Jun 06 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
Sep 17 Javascript
jQuery实现容器间的元素拖拽功能
Dec 01 jQuery
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中Date()时间日期函数的使用方法小结
2011/04/20 PHP
php限制ip地址范围的方法
2015/03/31 PHP
php商品对比功能代码分享
2015/09/24 PHP
yii2中的rules 自定义验证规则详解
2016/04/19 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
用jscript启动sqlserver
2007/06/21 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
javascript中caller和callee详解
2015/08/10 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
获取JS中网页各种高宽与位置的方法总结
2016/07/27 Javascript
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
详解Vue.js项目API、Router配置拆分实践
2018/03/16 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
解决python文件字符串转列表时遇到空行的问题
2017/07/09 Python
Python 文本文件内容批量抽取实例
2018/12/10 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
2019/06/24 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
ajax是什么及其工作原理
2012/02/08 面试题
成功的餐厅经营创业计划书
2014/01/15 职场文书
领导接待方案
2014/03/13 职场文书
教师师德演讲稿
2014/05/06 职场文书
2015年医院护理部工作总结
2015/04/23 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python