2012-01-13 2 views
2

私はかなり新しいjavascriptです。私は友人のための特別なシフトスケジューリングコードを書こうとしていました。それが現在動作する方法は以下の通りです:ツリーウォークの再帰を避ける最適な方法

function walk(currentDay) { 
    var today = allWorkDays[currentDay]; // An array of all workdays we need to schedule 
    var vertices = fetchCombinationsForToday(today); // Fetch an array of 0 length or more 
               // containing possibilities for the day 
               // according to rules set by user 
    for (var i=0; i<vertices.length; i++) { 
     [we add the vertices[i] to a running array] 
     walk(currentDay+1); 
    } 
    if (currentDay == sumOfAllDays) { // We are at a leaf 
      analyzeSchedule(); // This will keep a copy of the current schedule 
           // if it has a higher score than X 
    } 
    [some business to pop the last node/day we added to our global array] 
} 

は今コメントで指定されたルールは、通常、最後の5-10最後に追加された要素(日)を分析し、今日のためにシフトすることができるものを返すルールです。

私がここで問題になっているのは、プログラムが1000日以上の配列でもスケジュールを思い付かせることができるようにすることですが、再帰によって関数の呼び出し制限を超えることになります。 javascriptで再帰を使わずにツリーを歩く方法はありますか?たいていの場合、再帰によって解決可能な問題はループによって解決でき、逆もまた同様です。

頂点配列はツリーの早い段階で大きく(20-30要素)、素早​​く小さくなります(0-5要素)。私は決してこのコードを実行したことはありません[編集:そして、 "関数呼び出しの限界に達した"エラーは、それはすべての理論である方法で[編集:私はそれに到達するという事実]です。

+1

コードを実行し、デバッグし、コードを書き直し、構造を作成して考えてください。真剣にあなたのコードを実行する必要があります。擬似コードは良いですが、あなたのソリューションにあなたを得ることはできません。私たちはあなたに解決策を提供しません。 –

+0

@ EvilP私は同意しています。また、この音をいくつかのTDDを使う初期の時間のように追加します。あなたはすべてのイン・アウトを知っており、行動を検証したいと思っています。選択したjsユニットテストフレームワークを選択し、コーディングを開始します。あなたがより具体的な黙示の問題に遭遇した場合、*その*質問をしているかもしれません。 –

+1

申し訳ありませんが、擬似コードは、私(そしておそらく他の人)が問題を十分に理解して代替案を提示するためにしようとしていることの説明では不十分です。 – jfriend00

答えて

1

JavaScript Arraysは、開始/終了の値をプッシュ/ポップ、シフト/シフト解除するメソッドを提供するので、キューのように使用できます。たとえば、次のように

var a = [0, 1, 2]; 
a.push(3); // => 3 
a; // [0, 1, 2, 3] 
a.shift(); // => 0 
a; // [1, 2, 3] 
a.pop(); // => 3 
a; // [1, 2] 

あなたはツリー構造を歩くとする-訪問する配列からunshifting /プッシュとポップでノードを追跡することができますこの方法で。

+0

別の頂点を追跡するためにclosureを使用する代わりに、(配列の)配列を使用していただきありがとうございます。 VerticesAtLevel [0] = [x、y、z]ここで、x、y、zは可能な頂点であり、頂点の量が> 0であれば、私は現在のパスの配列を保つ。したがって、currentPath.push(VerticesAtLevel [currentLevel] [0])、次にVerticesAtLevel [currentLevel] .shift();続いてcurrentLevel ++;私は既にパスを追跡していたので、私は頂点を自分自身で追跡することを考えなかったと思います... – joual

関連する問題