循环 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 相关文章推荐
摘自启点的main.js
Apr 20 Javascript
Dom在ajax技术中的作用说明
Oct 25 Javascript
JavaScript实现页面滚动图片加载(仿lazyload效果)
Jul 22 Javascript
jquery图片不完全按比例自动缩小的简单代码
Jul 29 Javascript
jQuery取id有.的值的方法
May 21 Javascript
AngularJS实现表单验证
Jan 28 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
May 15 Javascript
Angular 作用域scope的具体使用
Dec 11 Javascript
JS解析后台返回的JSON格式数据实例
Aug 06 Javascript
node.js学习笔记之koa框架和简单爬虫练习
Dec 13 Javascript
jQuery实现鼠标移入显示蒙版效果
Jan 11 jQuery
原生微信小程序开发中 redux 的使用详解
Feb 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
人大复印资料处理程序_补充篇
2006/10/09 PHP
PHP安全配置
2006/12/06 PHP
PHP 编程请选择正确的文本编辑软件
2006/12/21 PHP
用PHP伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
php 传值赋值与引用赋值的区别
2010/12/29 PHP
PHP的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
基于jQuery的倒计时实现代码
2012/05/30 Javascript
JavaScript中的正则表达式简明总结
2014/04/04 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
2017/01/18 Javascript
微信小程序访问node.js接口服务器搭建教程
2017/04/25 Javascript
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
H5实现手机拍照和选择上传功能
2019/12/18 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
详解JavaScript之Array.reduce源码解读
2020/11/01 Javascript
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
对python多线程与global变量详解
2018/11/09 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
Python 转换文本编码实现解析
2019/08/27 Python
PHP基于phpqrcode类库生成二维码过程解析
2020/05/28 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
使用jquery实现HTML5响应式导航菜单教程
2014/04/02 HTML / CSS
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
Diptyque英国官方网站:源自法国的知名香氛品牌
2019/08/28 全球购物
大学生入党推荐书范文
2014/05/17 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
检讨书模板
2015/01/29 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
2016年“节能宣传周”活动总结
2016/04/05 职场文书