网络编程 
首页 > 网络编程 > 浏览文章

循环 vs 递归浅谈

(编辑:jimmy 日期: 2026/5/7 浏览:3 次 )

比如遍历以下一维数组:

复制代码 代码如下:
[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); 
    } 
}; 

上面的代码中,如果发现子节点是一个数组,就使用递归进入下一层;而同一层上的遍历则使用循环来完成。

上一篇:jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
下一篇:JavaScript对象创建及继承原理实例解剖
一句话新闻
高通与谷歌联手!首款骁龙PC优化Chrome浏览器发布
高通和谷歌日前宣布,推出首次面向搭载骁龙的Windows PC的优化版Chrome浏览器。
在对骁龙X Elite参考设计的初步测试中,全新的Chrome浏览器在Speedometer 2.1基准测试中实现了显著的性能提升。
预计在2024年年中之前,搭载骁龙X Elite计算平台的PC将面世。该浏览器的提前问世,有助于骁龙PC问世就获得满血表现。
谷歌高级副总裁Hiroshi Lockheimer表示,此次与高通的合作将有助于确保Chrome用户在当前ARM兼容的PC上获得最佳的浏览体验。
友情链接:杰晶网络 DDR爱好者之家 南强小屋 黑松山资源网 白云城资源网 站点导航 SiteMap