用于树创建的Javascript递归

用于树创建的Javascript递归,javascript,function,recursion,tree,scope,Javascript,Function,Recursion,Tree,Scope,我正在尝试创建一个函数,用于在游戏中的每个节点上创建带有游戏状态的决策树(不管是什么游戏)。我编写了递归函数(DFS),如下所示: function makeTree(anchor,count,player){ var subTree=null; var nodes=[]; if(player)var newPlayer=false; else var newPlayer=true; for (var i = 0; i <= 9; i++) {

我正在尝试创建一个函数,用于在游戏中的每个节点上创建带有游戏状态的决策树(不管是什么游戏)。我编写了递归函数(DFS),如下所示:

function makeTree(anchor,count,player){
    var subTree=null;
    var nodes=[];
    if(player)var newPlayer=false;
    else var newPlayer=true;
    for (var i = 0; i <= 9; i++) {
        for (var j = 0; j <= 9; j++) {
            if(anchor["state"][i][j]==0){
                var newState=anchor["state"];
                if(player)newState[i][j]=1;
                else newState[i][j]=2;
                var node={name:i+"_"+j, contents:[],state:newState, value:null, player:newPlayer};
                if(count>0){
                    var newCount=count-1;
                    subTree=makeTree(node,newCount,newPlayer);
                    node["contents"]=subTree;
                }
                nodes.push(node);
            }else{
                continue;
            }
        }
    }
    return nodes;
}
"root" - node - node - node
                     - node
                     - node
                     - node
                     - node
但是函数在不同的范围内改变变量,因此输出树如下:

function makeTree(anchor,count,player){
    var subTree=null;
    var nodes=[];
    if(player)var newPlayer=false;
    else var newPlayer=true;
    for (var i = 0; i <= 9; i++) {
        for (var j = 0; j <= 9; j++) {
            if(anchor["state"][i][j]==0){
                var newState=anchor["state"];
                if(player)newState[i][j]=1;
                else newState[i][j]=2;
                var node={name:i+"_"+j, contents:[],state:newState, value:null, player:newPlayer};
                if(count>0){
                    var newCount=count-1;
                    subTree=makeTree(node,newCount,newPlayer);
                    node["contents"]=subTree;
                }
                nodes.push(node);
            }else{
                continue;
            }
        }
    }
    return nodes;
}
"root" - node - node - node
                     - node
                     - node
                     - node
                     - node
我无法理解该函数中变量
newState
的情况,因为在完成递归后,原始变量
plocha
具有最新的
节点[“state”]
的值。有什么建议吗


编辑:多亏了Bergi,我意识到我需要做数组的深度复制,而不是引用它,所以我为数组的复制做了函数,现在可以了。谢谢你,伯吉

您的
state
属性是一个数组,它是可变的。在每次赋值时,您都会更改一个多维数组,该数组是所有节点的
状态
。您需要使每个
newState
都成为一个新数组,而不是通过所有函数递归传递
plocha
引用:

 …
 var newState = anchor["state"].slice(); // create copy of the outer array
 newState[i] = newState[i].slice(); // copy of the row to be modified
 newState[i][j] = player ? 1 : 2;
 …