因此,我有一个简单的任务来用Java脚本实现DFS。似乎很快的工作就会变成无休止的女巫狩猎。分配的想法是通过以dfs方式找到第一个“继承”功能来模仿多亲行为。第一个实现运行良好,但是经过大量测试,我发现有时它并没有访问某些分支。2天后,我将其归结为最简单的情况,删除了大部分代码以使其尽可能简单。所以这是创建树节点的函数:
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);
}
这是测试:
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"]));
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"]));
甚至更简单的情况:
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"]));
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在不同的分支中,因此它根本不会受到影响。我不确定错误来自哪里。请注意,为了简化此代码,我删除了所有输入检查和循环引用检查。
您已定义i
了全局范围,因此每次您对父级进行递归调用时,它都会递增,并且您会跳出调用方的循环。在两个for循环中,更改:
for(i=0...
到
for(var i=0...
这样,每个循环都有自己的i实例,不会造成混乱。有了这一更改,您的两个示例都可以工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句