我的电线在某处交叉(或者我睡眠不足)。我需要一个双向循环,而我当前的代码简直丑陋。
问题:我正在使用索引沿着线性数据结构运行。我有一个起始索引,比如说 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 做某事”放入一个单独的函数中。虽然这对于提出我的问题的方式来说是一个完美的想法,但我更喜欢将迭代代码放在其他地方,并将生产代码留在那里。我有一个很长的算法,想在完成后将其拆分,以最大程度地减少重新排列工作。