簡體   English   中英

用於樹創建的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;
 …

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM