2014-12-03 72 views
0

所以我做了一個簡單的任務,在Javascript實現DFS。看起來這將是一個快速的工作,變成永無止境的尋找女巫。轉讓的想法是模仿多父行爲,通過尋找DFS方式的第一個「繼承」功能。第一批實施運作良好,但大量的測試後,我發現,它並沒有去一些樹枝,有時。術後第2天,我煮下來到這種簡單的情況下,刪除了大部分代碼,使其作爲直截了當地。因此,這裏是一個創建樹節點的功能:的Javascript,奇怪的遞歸行爲,DFS

function myObject(parentArgs){ 
    var node = {}; 
    node.parents = []; 
    node.hasParents = function(){return this.parents.length>0}; 
    for(i = 0; i<parentArgs.length; i++){ 
     node.parents.push(parentArgs[i]); 
    } 

    node.call = function(fun,args){ 
     if(this[fun] != null) 
      return this[fun].apply(this,args); 
     var res = null; 
     for(i=0;i<this.parents.length; i++){ 
      res = this.parents[i].call(fun,args); 
      if(res!=null) 
       break; 
     } 
     return res; 
    }  
    return node; 
} 
myObject.create = function(args){ 
    return myObject(args); 
} 

,這裏是測試:

1(作品):

var c1 = myObject.create([]); 
var c2 = myObject.create([]); 
c2.func = function(args){return "func2: " + args;}; 
var c3 = myObject.create([c1,c2]); 
var c4 = myObject.create([]); 
var c5 = myObject.create([c3]); 
var c6 = myObject.create([c4,c5]); 
alert(c6.call("func",["hello"])); 

2(不工作):

var c0 = myObject.create([]); //this line was added 
var c1 = myObject.create([c0]); //c0 assigned as parent 
var c2 = myObject.create([]); 
c2.func = function(args){return "func2: " + args;}; 
var c3 = myObject.create([c1,c2]); 
var c4 = myObject.create([]); 
var c5 = myObject.create([c3]); 
var c6 = myObject.create([c4,c5]); 
alert(c6.call("func",["hello"])); 

甚至更​​簡單的情況:

3(作品):

var c1 = myObject.create([]); 
var c2 = myObject.create([]); 
c2.func = function(args){return "func2: " + args;}; 
var c3 = myObject.create([c1,c2]); 
alert(c3.call("func",["hello"])); 

4(不工作):

var c0 = myObject.create([]); //this line was added 
var c1 = myObject.create([c0]); //c0 assigned as parent 
var c2 = myObject.create([]); 
c2.func = function(args){return "func2: " + args;}; 
var c3 = myObject.create([c1,c2]); 
alert(c3.call("func",["hello"])); 

什麼是陌生人,是C0是從C2不同的分支,所以它不應該受到影響所有。我不確定錯誤來自哪裏。請注意,爲了簡化此代碼,我刪除了所有輸入檢查和循環引用檢查。

回答

1

您已經定義i具有全局範圍所以每次你打它就會增父遞歸調用,你在來電者跳出循環。在這兩個for循環的改變您:

for(i=0... 

for(var i=0... 

這樣,每個迴路都有自己的i實例,不會有混亂。隨着這一變化你的兩個例子的工作。