循环 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 学习笔记二 字符串拼接
Mar 28 Javascript
JS获取DropDownList的value值与text值的示例代码
Jan 07 Javascript
javascript引用类型指针的工作方式
Apr 13 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
May 25 Javascript
纯js实现无限空间大小的本地存储
Jun 18 Javascript
纯javascript实现图片延时加载方法
Aug 21 Javascript
浅谈js中调用函数时加不加括号的问题
Jul 28 Javascript
JS键盘版计算器的制作方法
Dec 03 Javascript
Bootstrap Table快速完美搭建后台管理系统
Sep 20 Javascript
基于react后端渲染模板引擎noox发布使用
Jan 11 Javascript
小程序点击图片实现自动播放视频
May 29 Javascript
微信小程序云开发实现数据添加、查询和分页
May 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
php添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
2014/06/24 Javascript
NodeJs中的VM模块详解
2015/05/06 NodeJs
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
JS中‘hello’与new String(‘hello’)引出的问题详解
2018/08/14 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
2019/04/26 Javascript
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
python实现寻找最长回文子序列的方法
2018/06/02 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
2018/11/07 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
Python Spyder 调出缩进对齐线的操作
2021/02/26 Python
css3的动画特效之动画序列(animation)
2017/12/22 HTML / CSS
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
Conforama西班牙:您的家具、装饰和电器商店
2020/02/21 全球购物
法学个人求职信范文
2014/01/27 职场文书
大学自主招生自荐信范文
2014/02/26 职场文书
大气污染防治方案
2014/05/19 职场文书
老龄工作先进事迹
2014/08/15 职场文书
邀请函样本
2015/02/02 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书
教您怎么制定西餐厅运营方案 ?
2019/07/05 职场文书
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript