どこかでワイヤーが交差しています (または十分な睡眠がありませんでした)。双方向ループが必要ですが、現在のコードは単純に醜いです。
問題: インデックスを使用して線形データ構造に沿って実行しています。私は開始インデックスを持っています.120としましょう。両方向に交互に走りたいです。
例: 120,121,119,122,118,123,117,...
方向ごとに個別に満たす必要がある停止基準があります。一方の方向が満たされている場合は、もう一方の方向に実行したいだけです。両方が満たされている場合は、ループを終了する必要があります。さらに、次のインデックスが無効な場合 (データ構造の終わり、0 より小さいか 200 より大きいなど) は停止する必要があります。
例: 116 後方、130 前方で実行を停止: 120,121,119,122,118,123,117,124,116,(break),125,126,127,128,129,130。
最初に一方の方向に実行してから、もう一方の方向に進むことは残念ながらオプションではありません。
私の現在のコードは単純に醜いです。「生産的な」コードを含まない行がたくさんあります。反復ロジックのみ:
int start_idx = 120;
int forward_idx = start_idx;
int backward_idx = start_idx;
bool next_step_forward = true; //should next step be forward or backward?
int cur_idx;
while(backward_idx >= 0 || forward_idx >= 0)
{
if(next_step_forward //if we should step forward
&& forward_idx >= 0) //and we still can step forward
{
cur_idx = ++forward_idx;
if(forward_idx >= 200) //200 is fictive "max index"
{
next_step_forward = false;
forward_idx = -1; //end of data reached, no more stepping forward
continue;
}
if(backward_idx >= 0)
{
next_step_forward = false;
}
}
else if(!next_step_forward
&& backward_idx >= 0)
{
cur_idx = --backward_idx;
if(backward_idx < 0) //beginning of data reached, no more stepping backward
{
next_step_forward = true;
continue;
}
if(forward_idx >= 0)
{
next_step_forward = true;
}
}
else
{
next_step_forward = !next_step_forward; //ever hit?, just security case
continue;
}
//loop body
//do something with cur_idx here
if(stoppingCriterionMet())
{
if(cur_idx > start_idx)
{ //this was a forward step, stop forward stepping
forward_idx = -1;
}
else
{ //this was backward step, stop backward stepping
backward_idx = -1;
}
}
}
何か不足していますか?ヒントをいただければ幸いです。ありがとう。
編集1:「cur_idxで何かをする」を別の関数に入れる、非常に素晴らしい答えがたくさんあります。これは私の質問に対する完璧なアイデアですが、反復コードを別の場所に置き、生産的なコードをそこに残すことを好みます。長いアルゴリズムがあり、再配置作業を最小限に抑えるために、終了後に分割したいと考えています。