gpt4 book ai didi

Javascript、奇怪的递归行为、DFS

转载 作者:行者123 更新时间:2023-12-03 11:17:32 30 4
gpt4 key购买 nike

所以我有一个简单的任务,用 Javascript 实现 DFS。看似快速的工作却变成了永无休止的政治迫害。赋值的想法是通过以 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 位于不同的分支中,因此它根本不应该受到影响。我不确定这个错误是从哪里来的。请注意,为了简化此代码,我删除了所有输入检查和循环引用检查。

最佳答案

您已经在全局范围内定义了 i ,因此每次您对父级进行递归调用时,它都会递增,并且您会跳出调用者中的循环。在两个 for 循环中更改:

for(i=0...

for(var i=0...

这样每个循环都有自己的 i 实例,并且不会出现困惑。通过这种更改,您的两个示例都可以工作。

关于Javascript、奇怪的递归行为、DFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27270264/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com