Javascript,奇怪的递归行为,DFS

埃内斯塔斯·罗密卡(Ernestas Romeika)

因此,我有一个简单的任务来用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);
}

这是测试:

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实例,不会造成混乱。有了这一更改,您的两个示例都可以工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

递归函数的奇怪行为

来自分类Dev

奇怪的PowerShell递归行为

来自分类Dev

递归函数的奇怪行为

来自分类Dev

递归算法中的奇怪行为,

来自分类Dev

递归函数中的奇怪/奇怪行为

来自分类Dev

奇怪的JavaScript行为(作业)

来自分类Dev

JavaScript toString()奇怪的行为

来自分类Dev

JavaScript toLowerCase奇怪的行为

来自分类Dev

JavaScript getElementById的奇怪行为

来自分类Dev

Javascript的奇怪行为

来自分类Dev

Javascript for 循环奇怪的行为

来自分类Dev

javascript递归参数行为

来自分类Dev

JavaScript递归异常行为?

来自分类Dev

javascript递归参数行为

来自分类Dev

JavaScript递归异常行为?

来自分类Dev

递归函数在PHP中的行为很奇怪

来自分类Dev

数组的奇怪JavaScript变量行为

来自分类Dev

JavaScript中奇怪的函数行为

来自分类Dev

JavaScript对象分配的奇怪行为

来自分类Dev

JavaScript OnClick事件的奇怪行为

来自分类Dev

javascript调用方法的奇怪行为

来自分类Dev

JavaScript日期对象-奇怪的行为

来自分类Dev

JavaScript中奇怪的函数行为

来自分类Dev

JavaScript while循环奇怪的行为

来自分类Dev

Javascript函数中的奇怪行为

来自分类Dev

Javascript的“拼接”方法奇怪的行为

来自分类Dev

JavaScript 对象更新行为(奇怪?)

来自分类Dev

javascript中循环的奇怪行为

来自分类Dev

javascript Promise 中的奇怪行为