Javascript 树创建的递归
Javascript recursion for tree creation
我正在尝试创建用于在游戏中的每个节点中创建具有游戏状态的决策树的函数(无论是什么游戏)。我这样写递归函数(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;
}
并通话:
var tree={};
var hrac=true;
var plocha=[[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0]];
var state=plocha;
tree={name: "root",
contents:[],
state:state,
value:null,
player: hrac};
tree["contents"]=makeTree(tree,3,hrac);
但是函数在不同的范围内改变变量,所以输出树将是这样的:
"root" - node - node - node
- node
- node
- node
- node
我无法弄清楚该函数中变量 newState
发生了什么,因为在完成递归后,原始变量 plocha
具有最新的值 node["state"]
。有什么建议吗?
编辑:多亏了 Bergi,我意识到我需要对数组进行深层复制而不是引用它,所以我为数组的副本创建了函数,现在可以了。谢谢伯吉!
你的state
属性是一个数组,它是可变的。在每次分配时,您更改一个多维数组,即 所有 节点的 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;
…
我正在尝试创建用于在游戏中的每个节点中创建具有游戏状态的决策树的函数(无论是什么游戏)。我这样写递归函数(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;
}
并通话:
var tree={};
var hrac=true;
var plocha=[[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0]];
var state=plocha;
tree={name: "root",
contents:[],
state:state,
value:null,
player: hrac};
tree["contents"]=makeTree(tree,3,hrac);
但是函数在不同的范围内改变变量,所以输出树将是这样的:
"root" - node - node - node
- node
- node
- node
- node
我无法弄清楚该函数中变量 newState
发生了什么,因为在完成递归后,原始变量 plocha
具有最新的值 node["state"]
。有什么建议吗?
编辑:多亏了 Bergi,我意识到我需要对数组进行深层复制而不是引用它,所以我为数组的副本创建了函数,现在可以了。谢谢伯吉!
你的state
属性是一个数组,它是可变的。在每次分配时,您更改一个多维数组,即 所有 节点的 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;
…