2016-09-05 20 views
0

グラフを横断しようとしています。すべての頂点が接続されていないためです。私はすべてのノードからのトラバーサルを開始する必要があります。ノードは2次元配列にあります。私は大きなテキストファイルからの入力を取得し、ここで私はそれを行う方法です午前:ネストされたループで再帰関数が呼び出されない

lr.on('end', function(){ 
//Callback called when file reading is complete 
initialize(); //initialize stuff 
startTraversal(); 
}); 

としてstartTraversal()メソッドが定義されています

function startTraversal(){ 
    for(i=0;i<x;i++){ 
    for(j=0;j<y;j++){ 
     console.log(i+', '+j); 
     traverse(i,j); //Call Traverse i,j every time once 
    } 
    } 
} 

traverse(i,j)は再帰関数です。だから私はノードi,jから可能なすべてのパスを見て、traverseを開始します。 traverse()方法の広範な構造は以下である:

startTraversal()関数呼び出しのすぐ
function traverse(i,j){ 
var possible = getAdjacent(i,j); //getPossible Routes 
if(possible.length == 0){ 
    //do stuff 
    return; //Tried adding return statement here 
} 

else{ 
    for(x=0;x<possible.length;x++){ 
     if(!data[a][b].visited) //if node is not visited 
      traverse(a,b); 

     //Do further stuff when this^call returns, finding max etc 
     ... 
     } //End of for 
    } 
} 

、内側ループのみ私はconsole.logから確認iの最初の値に対して実行されます。私はなぜループがさらに実行されないのか理解できません。

PS:ネストされたループをコールバックの外に手動で配置すると、ループとトラバーサルが期待通りに行われます。しかし、ファイルが完全に読み込まれた場合にのみstartTraversal()メソッドを開始する必要があります。ループが継続しないように、値が返されない関数traverse()と何か関係があると思います。私はreturntraverseメソッドの基本ケースに追加しようとしましたが、成功しませんでした。

この問題に関する洞察は深く感謝しています。ネストされたループで再帰呼び出しを処理する方法を知りたければ、少なくともjavascriptで知りたいでしょう。

+2

実際に関数内の変数を宣言する必要があります...現在、すべてのループは同じカウンタを共有しています。 – Teemu

+0

getAdjacent()メソッド、コールバックを持っていますか?そして、内側ループがiの最初の値に対してのみ実行されると言ったとき、あなたは値0を意味しますか?現実には、書かなかったコードにコールバックメソッドが含まれているかどうかを知りたい場合 – Ediruth

+0

すべてのループが同じカウンタを使用する方法はわかりません。変数 'i'と' j'をパラメタとして 'traverse'関数に渡しています。彼らは価値のあるものになるでしょう。 –

答えて

1

グローバル変数は決して(*)使用しないでください。あなたのx, y, i, j(おそらく他の)変数は、おそらくあなたの問題の原因であるグローバルなようです。

x & yあなたの配列/グラフ/何かの "次元数"変数のように見えるので、startTraversalの引数として渡すことをお勧めします。 i & jはローカル変数なので、使用する関数の中で宣言する必要があります(例:for(var i = 0; i < x; i++))。すべてのグラフ関連関数の引数としてグラフ自体を渡すことも良い考えです。

Strict modeも考慮する必要があります。制限事項の1つは、間違ってグローバル変数を作成できないということです。


(*) - もちろんそこにグローバル変数は、実際に望まれているいくつかのケースがありますが、それはほとんどの人々がグローバル、再利用可能なモジュールや定数、共通の価値観のいくつかの種類を作成に関するものです。 "ローカル"操作にはグローバルを使用しないでください。

+0

Strictモードについて指摘してくれてありがとう@mdziekon。実際、エラーの原因となっていた関数で 'x'を再利用していました。 –

関連する問題