2010-07-01 30 views
26

hey Tôi đang tìm là giải pháp sạch cho vấn đề này:looping theo hai hướng

alt text

tôi bắt đầu vòng lặp với i = 0 ở bước lặp thứ hai i = 1, sau đó i = -1 và sau đó i = 2 vv.

cách lập trình này với vòng lặp for một cách rõ ràng?

+0

Kể từ khi bạn yêu cầu một thực hiện cụ thể, những gì ngôn ngữ được bạn làm việc tại? –

+0

php hoặc js sẽ là tốt – antpaw

Trả lời

11

Nếu bạn không nhớ có vòng lặp bên trong xuất hiện 3 lần:

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

2 lần với một if:

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

lần duy nhất nhưng với một biểu hiện xấu xí:

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

    f(i); 
} 
+1

cảm ơn, tôi thích phiên bản "biểu hiện xấu xí" nhất :) – antpaw

+0

@antpaw whhhhhyyyyyyyyy? Ngoài việc xấu nhất, nó là một trong những phức tạp và không hiệu quả nhất cũng về xử lý. – stinky472

+0

+1. Một giải pháp có thể, và thậm chí có thể được yêu cầu nếu chúng ta không có quyền truy cập ngẫu nhiên nhưng chỉ truy cập hai chiều vào một danh sách liên kết, ví dụ, là sử dụng hai trình lặp (một được giảm đi, các biến khác được tăng lên và truy cập phần tử đầu tiên tại sự bắt đầu). – stinky472

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 
} 

Nên làm những gì bạn muốn

+0

+1 cho sự tao nhã dưới dạng; bạn có thể phải trích xuất do_stuff thành một hàm riêng biệt để tránh trùng lặp mã, nhưng nếu không nó sẽ khá đẹp. –

+1

+1, để đơn giản –

+0

-1, để đơn giản – mario

5

Mỗi vòng lặp, có vẻ như bạn đang thêm n*(-1)^(n+1), trong đó n là bước bạn đang thực hiện, bắt đầu từ 1 và bắt đầu từ 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 

, vv

Từ đây, nó phụ thuộc vào những gì ngôn ngữ mà bạn sẽ muốn viết. Lặp lại từ n = 0 đến bất cứ nơi nào bạn đang dừng lại.

chỉnh sửa đây là câu trả lời không tốt. nhưng vui vẻ = D

(Tôi nói thêm rằng bit cuối cùng vì ngay sau khi tôi đưa ra là chỉnh sửa, có người downvoted tôi =()

+0

+1 Đây là suy nghĩ của tôi ngay lập tức cho một câu trả lời là tốt :) – NibblyPig

3

Đây là triển khai thực hiện trong javascript

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

Hy vọng nó giúp.

+0

hehe kỹ năng tốt đẹp :) – antpaw

+0

giảm sự phụ thuộc của bạn vào Toán bằng cách thực hiện 'i = 0; i <10;i=(i<=0> 1-i: -i)' – fbstj

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

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

tôi đã sử dụng chức năng sin:

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

Một sửa đổi của giải pháp viên đạn rơi, mà sẽ xử lý các trường hợp chỉ số 0 mà không có một điều kiện đặc biệt.

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

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

Có mẫu cho vòng lặp này.Nhìn vào nó trên dòng số - nó đi như thế:

  • 0 bước lùi
  • 1 bước tiến
  • 2 bước lùi
  • 3 bước về phía trước
  • 4 bước lùi

Đây là một giải pháp - tiếp tục tăng kích thước bước trong mỗi lần lặp của vòng lặp, và lật hướng (tiến/lùi) mỗi lần. Tiếp tục thêm vào giá trị hiện tại.

// 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 
} 

Một giải pháp sử dụng generators trong JavaScript 1,7 mà là giống với @ của solution FallingBullet nhưng nhiều thẩm mỹ để mắt tôi :)

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

Trong C. Giá trị của N là tổng số số lượng giá trị trong chuỗi bạn muốn tạo.

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

Chỉ cần một bổ sung một phép trừ và phủ định:

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

tạo ra một vòng lặp bên trong:

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

Đối với những gì nó có giá trị, đây là cách giải thích riêng của tôi về vấn đề này.

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

tôi có thể đi với:

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