2010-07-01 37 views
26

嘿,我正在尋找循環的清潔解決這個問題:在兩個方向

alt text

我開始i = 0循環在第二循環步驟i = 1,然後i = -1然後i = 2等。

如何用一個乾淨的方式用for循環編程?

+0

既然你問一個具體的實現,你的工作是什麼語言? – 2010-07-01 08:58:29

+0

php或js會很好 – antpaw 2010-07-01 08:59:45

回答

11

如果你不介意的內環出現3次:

f(0); 
for (var i = 1; i <= 3; ++ i) { 
    f(i); 
    f(-i); 
} 

2倍與if

for (var i = 0; i <= 3; ++ i) { 
    f(i); 
    if (i > 0) 
    f(-i); 
} 

單時間,但有一個醜陋的表達式:

for (var j = 1; j <= 7; ++ j) { 
    var i = j/2; 
    if (j % 2) i = -i; 

    f(i); 
} 
+1

謝謝,我最喜歡「醜陋的表情」版本:) – antpaw 2010-07-01 09:03:24

+0

@antpaw whhhhhyyyyyyyyy?除了最醜陋之外,它在處理方面也是最複雜和低效的。 – stinky472 2010-07-01 14:03:50

+0

+1。另一種可能的解決方案,如果我們沒有隨機訪問,但是隻能雙向訪問鏈表,例如使用兩個迭代器(一個遞減,另一個遞增,訪問第一個元素開始)。 – stinky472 2010-07-01 14:06:22

27
f(0); //do stuff with 0 

for(var i = 1; i<len; i++) //where len = positive boundary 
{ 
    f(i); //do stuff with i 
    f(-i); //do stuff with -i 
} 

應該做你想做的事

+0

+1;你可能不得不將do_stuff提取到一個單獨的函數中,以避免代碼重複,否則它非常漂亮。 – 2010-07-01 09:01:21

+1

+1,爲簡單起見 – 2010-07-01 09:02:52

+0

-1,爲了簡化 – mario 2010-07-01 09:16:11

5

每一個循環,你似乎都要加入n*(-1)^(n+1),其中n是你當前正在採取的步驟,從1開始,從i = 0開始。

initialize i = 0 
n=0, i+=0*(-1)^1 # 0 
n=1, i+=1*(-1)^2 # 1 
n=2, i+=2*(-1)^3 # -1 
n=3, i+=3*(-1)^4 # 2 

從這裏,這取決於你想在寫什麼語言。迭代從n = 0到哪裏都會停止。

編輯這是一個不好的答案。但有趣= d

(我補充說,最後一點,因爲只要我做了修改,有人downvoted我=()

+0

+1這是我直接想到的答案:) – NibblyPig 2010-07-01 09:15:13

3

這是實現在JavaScript

for (var i = 0; Math.abs(i)<10; i=(i<=0?Math.abs(i)+1:-i)) { 
    console.debug(i) 
} 

希望它能幫助。

+0

hehe不錯的技巧:) – antpaw 2010-07-01 09:05:19

+0

減少你對數學的依賴,做'i = 0; i <10;i=(i<=0> 1-i:-i) – fbstj 2011-12-11 16:29:02

1
 for (int i = 0; i < 10; i++) 
     { 
      int div = i/2; 
      int mod = i % 2; 

      int offset = mod == 0 ? div : -div; 
     } 
2

我用正弦函數:

for ($i = 0; $i < 10; $i++) 
{ 
    echo round(0.5 * $i * sin((0.5 + $i) * M_PI))."\n"; 
} 
0

對下降子彈的解決方案進行修改,即可在沒有特殊情況的情況下處理0索引案例。

//do stuff with 0 
for(int i = 0; i< (arrayLength/2); i++) 
{ 
    //do stuff with i 

    if(-i != i) 
    { 
     //do stuff with negIndex 
    } 
} 
1

這個循環有一個模式。上的數字線看它 - 它是這樣:

  • 0步向後
  • 1步驟向前
  • 2步向後
  • 3步向前
  • 4步驟向後

這裏有一個解決方案 - 在循環的每次迭代中不斷增加步長,並且每次都翻轉方向(向前/向後)。繼續添加到當前值。

// n is the number of elements to generate 
for(var i = 0, value = 0, dir = -1; i < n; i++) { 
    value = value + (dir * i); 
    console.log(value); 
    dir = dir * -1; // reverse direction 
} 

在JavaScript 1.7使用generators另一種解決方案,其是相同的@ FallingBullet的solution但更美觀的我的眼睛:)

function sequence() { 
    var i = 0; 

    yield i; 

    while(true) { 
     i++; 
     yield i; 
     yield -i; 
    } 
} 


var seq = sequence(); 
seq.next(); // 0 
seq.next(); // 1 
seq.next(); // -1 
seq.next(); // 2 
... 
0

在C. N的值是總您希望產生的序列中的數值。

int i, n = 0, m = 1; 
for (i = 1; i < N; i++, m = -m) { 
    /* n is the next in the sequence */ 
    n += m * i; 
} 
3

只是一個增加一個減法和否定:

for(int i=0, d=1, f=-1; i<10; i+=d, d=f-d, f=-f) 
{ 
    printf("%d\n", i); 
} 

產生的內循環:

push  esi 
push  offset string "%d\n" (0D20F4h) 
call  dword ptr [__imp__printf (0D20A4h)] 
mov   eax,ebx 
add   esi,edi 
sub   eax,edi 
add   esp,8 
neg   ebx 
mov   edi,eax 
cmp   esi,0Ah 
jl   wmain+10h (0D1010h) 
1

對於它的價值,這是我自己的問題的解釋。

for (var i = 0; i > -8; i = (i<=0) - i) // arbitrary condition stops loop at -8 
0

我可能會一起去:

for (var i = 0; i <= max; i = (i <= 0) ? -i + 1 : -i) 
{ 
    f(i); 
}