【问题标题】:Javascript, strange recursion behavior, DFSJavascript,奇怪的递归行为,DFS
【发布时间】:2015-01-31 22:19:14
【问题描述】:

所以我有一个简单的任务是在 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 在不同的分支中,所以它根本不应该受到影响。我不确定错误来自哪里。请注意,为了简单起见,我删除了所有输入检查和循环引用检查。

【问题讨论】:

    标签: javascript recursion tree depth-first-search


    【解决方案1】:

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

    for(i=0...
    

    for(var i=0...
    

    这样每个循环都有自己的 i 实例,不会造成混淆。随着这种变化,您的两个示例都可以正常工作。

    【讨论】:

      猜你喜欢
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 2019-04-11
      • 2013-07-23
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多