2014-12-03 74 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实例,不会有混乱。随着这一变化你的两个例子的工作。