簡體   English   中英

用Java語言進行簡單遞歸的問題

[英]Problem with simple Recursion in Javascript

這是代碼段,這會陷入無限循環-帶有“太多的遞歸錯誤”。

SW = {
    WData : {
        wf : {

            roots : [852,1517,1523,1540],
            leaves : [],
            features : {
                852:  { "cf":"855,1848"},
                1517: { "cf":"1929,1930"},
                1523: { "cf":""},
                1540: { "cf":"1546,1549"},
                855:  { "cf":"" },
                1848: { "cf":""},
                1929: { "cf":""},
                1930: { "cf":""},
                1546: { "cf":"1600"},
                1549: { "cf":""},
                1600: { "cf":""}                
            }
        }
    },

    init: function init(){                
        this.buildTree();
        //console.log(this.WData.wf.leaves);
    },

    buildTree : function(){
        this.getLeaves(this.WData.wf.roots);
    },

    getLeaves: function(roots){
        for(var i in roots){
            var root = this.WData.wf.roots[i];

            if( this.WData.wf.features[ root ].cf === ""){

                this.WData.wf.leaves.push( root );
                return false;
            }
            else{
                this.getLeaves( this.WData.wf.features[root].cf.split(',').map(Number) );
            }
        }
        return false;
    }
}


SW.init();

無法理解這里的問題。 我感覺自己犯了一個簡單的錯誤。

http://jsfiddle.net/eWGG8/4/

您有幾個問題:

  1. 在你的循環的開始,你應該用roots而不是this.WData.wf.roots ,例如。 像這樣:

     var root = roots[i]; 
  2. 您正在嘗試將新項目推送到字符串而不是數組上,因此在您的結構中,將葉子更改為以下內容:

     leaves : ["asdf"], 
  3. 當您嘗試將其分配給結果div(在jsFiddle中)時,這將導致錯誤,因此請使用join創建一個字符串

     $('#result').append( SW.WData.wf.leaves.join(",") ); 

您的終止條件在此行中:

for(var i in roots){

因此,為什么不繼續使用類似console.log(i)來查看它是否在按照您的想法進行。 這種技術通常比調試器快。

您在遞歸中一直引用原始樹-您可能想在遞歸傳入的節點上拆分:

getLeaves: function(roots){
for(var i in roots){
    var root = roots[i];

    if( !(root.cf)){

        this.WData.wf.leaves.push( root );
        return false;
    }
    else{
        this.getLeaves( root.cf.split(',').map(Number) );
    }
}
return false;

據我所知,您需要更改features條目中cf屬性的值以反映您已經對其進行了解析。 如果不這樣做,則此代碼分支

else{
    this.getLeaves( this.WData.wf.features[root].cf.split(',').map(Number) );
}

如果我是對的,將無限地向leaves Array添加值。

因此,嘗試添加如下內容:

 else {

    var cf = this.WData.wf.features[root].cf ; // save the current cf value

    //... change this.WData.wf.features[root].cf to the desired value

        this.getLeaves( cf.split(',').map(Number) ) ;


 }

順便說一下, Array.map是瀏覽器實現特定的功能(對於Gecko瀏覽器,例如Firefox)。 換句話說,您的代碼在未實現的地方將無法正常工作。

另外,我認為,最好添加注釋並折疊代碼以使其更易於理解。 現在的書寫方式雖然簡潔但難以把握其基本目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM