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不同的分支,所以它不应该受到影响所有。我不确定错误来自哪里。请注意,为了简化此代码,我删除了所有输入检查和循环引用检查。