我把電線穿過某處(或者我沒有足夠的睡眠)。我需要一個雙向循環,而我目前的代碼只是簡單的醜陋。簡化/確定這個雙向循環?
問題:我沿着一個使用索引的線性數據結構運行。我有一個開始索引,可以說120.我想在兩個方向交替運行。
實施例: 120,121,119,122,118,123,117,...
我有需要分別滿足每個方向停止標準。如果它滿足一個方向,我只想跑向另一個方向,如果兩個都滿足,我需要退出循環。此外,如果下一個索引無效(數據結構結束,比如小於0或大於200),我需要停止。
示例:在116向後和130向前停止執行: 120,121,119,122,118,123,117,124,116,(中斷),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做某事」放到一個單獨的函數中。雖然這對於我的問題被問到的方式來說是一個完美的想法,但我更喜歡將迭代代碼放在其他地方,並將生產代碼留在那裏。我有一個很長的算法,並希望在完成後將其拆分,以儘量減少重新排列工作。
你應該簡化你的問題。而不是「線性數據結構」只是說數組。而不是「停止標準」,只是停留。如果你清理你的問題,你可能會看到一個更清潔的解決方案。 – 2010-09-10 20:57:08
如果這是作業,你應該添加標籤 – 2010-09-10 20:57:40
對不起,我會去睡覺來解決這個問題。這不是功課。哪位瘋子想糾正學生提出的解決方案? – B3ret 2010-09-10 21:15:45