国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

循環 vs 遞歸淺談

2024-05-06 14:19:29
字體:
來源:轉載
供稿:網友

比如遍歷以下一維數組:

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

上面的代碼中,如果發現子節點是一個數組,就使用遞歸進入下一層;而同一層上的遍歷則使用循環來完成。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 凤山市| 通辽市| 芷江| 民丰县| 宜章县| 商丘市| 阿拉善右旗| 拉萨市| 庆元县| 莱阳市| 尼玛县| 牟定县| 吴桥县| 三河市| 东乡族自治县| 靖安县| 德清县| 甘南县| 赤城县| 柞水县| 大新县| 武平县| 柯坪县| 库伦旗| 吉林市| 龙山县| 石门县| 雅安市| 深水埗区| 夏津县| 田东县| 从化市| 德清县| 柏乡县| 工布江达县| 东乡族自治县| 五指山市| 民勤县| 泗阳县| 台湾省| 清徐县|