hey Tôi đang tìm là giải pháp sạch cho vấn đề này:looping theo hai hướng
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?
hey Tôi đang tìm là giải pháp sạch cho vấn đề này:looping theo hai hướng
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?
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);
}
cảm ơn, tôi thích phiên bản "biểu hiện xấu xí" nhất :) – antpaw
@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
+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
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
+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, để đơn giản –
-1, để đơn giản – mario
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 =()
+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
for (int i = 0; i < 10; i++)
{
int div = i/2;
int mod = i % 2;
int offset = mod == 0 ? div : -div;
}
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";
}
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
}
}
Có mẫu cho vòng lặp này.Nhìn vào nó trên dòng số - nó đi như thế:
Đâ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
...
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;
}
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)
Đố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
tôi có thể đi với:
for (var i = 0; i <= max; i = (i <= 0) ? -i + 1 : -i)
{
f(i);
}
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? –
php hoặc js sẽ là tốt – antpaw