循环 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 相关文章推荐
网站上面有这种切换效果
Jun 26 Javascript
Javascript 键盘事件的组合使用实现代码
May 04 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
Dec 09 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
Jan 16 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
Mar 09 Javascript
js实现表单检测及表单提示的方法
Aug 14 Javascript
原生js模拟淘宝购物车项目实战
Nov 18 Javascript
聊一聊JavaScript作用域和作用域链
May 03 Javascript
Mongoose经常返回e11000 error的原因分析
Mar 29 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
Dec 14 Javascript
vue实现PC端录音功能的实例代码
Jun 05 Javascript
原生js实现轮播图特效
May 04 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 Undefined index和Undefined variable的解决方法
2008/03/27 PHP
PHP学习笔记之一
2011/01/17 PHP
PHP类继承 extends使用介绍
2014/01/14 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
使用javascript实现简单的选项卡切换
2015/01/09 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
2016/03/08 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
2018/12/22 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
django+mysql的使用示例
2018/11/23 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
python多线程与多进程及其区别详解
2019/08/08 Python
Django实现分页显示效果
2019/10/31 Python
vue常用指令代码实例总结
2020/03/16 Python
美国摄影爱好者购物网站:Focus Camera
2016/10/21 全球购物
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
总经理助理工作职责
2014/02/06 职场文书
竞选部长演讲稿
2014/04/26 职场文书
企业职业病防治方案
2014/05/29 职场文书
公务员党员评议表自我鉴定
2014/09/14 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书
Java并发编程之原子性-Atomic的使用
2022/03/16 Java/Android
Python中第三方库Faker的使用详解
2022/04/02 Python
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers