循環(huán) vs 遞歸淺談
比如遍歷以下一維數(shù)組:
[javascript] view plaincopyprint?
var a1 = [1];
var a2 = [1, 2];
var a3 = [1, 2, 3];
雖然它們長(zhǎng)度不一,但循環(huán)應(yīng)付它們非常容易,也很優(yōu)雅:
[javascript] view plaincopyprint?
var dumpArrayByLoop = function(a) {
for (var i = 0; i < a.length; i++) {
println(a[i]);
}
};
如果改用遞歸,則看起來(lái)比較別扭:
[javascript] view plaincopyprint?
var dumpArrayByRecur = function(i, a) {
if (i < a.length) {
println(a[i]);
dumpArrayByRecur(i + 1, a);
}
};
它們能輸出同樣的結(jié)果,但相比之下遞歸版本看起來(lái)很笨拙。
現(xiàn)在想想,如果元數(shù)據(jù)變化了:維度擴(kuò)大到二維。
[javascript] view plaincopyprint?
var a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
此時(shí)需要再外面再套一層循環(huán)變成雙重循環(huán):
[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]);
}
}
};
如果數(shù)據(jù)的維度再繼續(xù)擴(kuò)大,變成三維、四維……甚至動(dòng)態(tài)的N維數(shù)組。使用循環(huán)該怎么處理呢?
在這種“層數(shù)”很深,甚至不確定的情況下,就需要用“遞歸”來(lái)解決跨“層”的問(wè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);
}
};
上面的代碼中,如果發(fā)現(xiàn)子節(jié)點(diǎn)是一個(gè)數(shù)組,就使用遞歸進(jìn)入下一層;而同一層上的遍歷則使用循環(huán)來(lái)完成。
相關(guān)文章
JS實(shí)現(xiàn)模仿微博發(fā)布效果實(shí)例代碼
這篇文章主要介紹了JS實(shí)現(xiàn)模仿微博發(fā)布效果實(shí)例代碼,有需要的朋友可以參考一下2013-12-12JS 實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼的“59秒后重新發(fā)送驗(yàn)證短信”功能
這篇文章主要介紹了JS 實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼的“59秒后重新發(fā)送驗(yàn)證短信”功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08javascript globalStorage類(lèi)代碼
非IE瀏覽器“userdata”的解決方案2009-06-06JavaScript獲取并更改input標(biāo)簽name屬性的方法
這篇文章主要介紹了JavaScript獲取并更改input標(biāo)簽name屬性的方法,涉及javascript針對(duì)表單元素屬性的相關(guān)操作技巧,需要的朋友可以參考下2015-07-07ES6學(xué)習(xí)教程之對(duì)象的擴(kuò)展詳解
這篇文章主要給大家介紹了ES6中對(duì)象擴(kuò)展的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05JavaScript使用高階生成器進(jìn)行過(guò)濾以生成素?cái)?shù)
生成器大家都知道是怎么一回事,但是高階生成器又是什么東西呢,下面小編就來(lái)為大家簡(jiǎn)單介紹一下如何使用高階生成器進(jìn)行過(guò)濾以生成素?cái)?shù)吧2024-02-02js實(shí)現(xiàn)帶有動(dòng)畫(huà)的返回頂部
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)帶有動(dòng)畫(huà)的返回頂部,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08XHTML-Strict 內(nèi)允許出現(xiàn)的標(biāo)簽
XHTML-Strict 內(nèi)允許出現(xiàn)的標(biāo)簽...2006-12-12