私はかなり新しい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要素)。私は決してこのコードを実行したことはありません[編集:そして、 "関数呼び出しの限界に達した"エラーは、それはすべての理論である方法で[編集:私はそれに到達するという事実]です。
コードを実行し、デバッグし、コードを書き直し、構造を作成して考えてください。真剣にあなたのコードを実行する必要があります。擬似コードは良いですが、あなたのソリューションにあなたを得ることはできません。私たちはあなたに解決策を提供しません。 –
@ EvilP私は同意しています。また、この音をいくつかのTDDを使う初期の時間のように追加します。あなたはすべてのイン・アウトを知っており、行動を検証したいと思っています。選択したjsユニットテストフレームワークを選択し、コーディングを開始します。あなたがより具体的な黙示の問題に遭遇した場合、*その*質問をしているかもしれません。 –
申し訳ありませんが、擬似コードは、私(そしておそらく他の人)が問題を十分に理解して代替案を提示するためにしようとしていることの説明では不十分です。 – jfriend00