循環(huán) vs 遞歸淺談
更新時間:2013年02月28日 17:45:48 作者:
本文代碼使用 JavaScript。
一些同學對遞歸的理解還停留在“是一種求階乘比循環(huán)低效的方法”。但其實遞歸和循環(huán)處理的問題是不同。拿“遍歷數組”這個問題來說:循環(huán)適合同一維度(單層長度不限)上的遍歷,而遞歸則適合跨維度(層數不限)的遍歷。
比如遍歷以下一維數組:
復制代碼 代碼如下:
[javascript] view plaincopyprint?
var a1 = [1];
var a2 = [1, 2];
var a3 = [1, 2, 3];
雖然它們長度不一,但循環(huán)應付它們非常容易,也很優(yōu)雅:
復制代碼 代碼如下:
[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]];
此時需要再外面再套一層循環(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]);
}
}
};
如果數據的維度再繼續(xù)擴大,變成三維、四維……甚至動態(tài)的N維數組。使用循環(huá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ā)現子節(jié)點是一個數組,就使用遞歸進入下一層;而同一層上的遍歷則使用循環(huán)來完成。
相關文章
JS 實現發(fā)送短信驗證碼的“59秒后重新發(fā)送驗證短信”功能
這篇文章主要介紹了JS 實現發(fā)送短信驗證碼的“59秒后重新發(fā)送驗證短信”功能,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08
JavaScript獲取并更改input標簽name屬性的方法
這篇文章主要介紹了JavaScript獲取并更改input標簽name屬性的方法,涉及javascript針對表單元素屬性的相關操作技巧,需要的朋友可以參考下2015-07-07

