петля в двух направлениях - PullRequest
26 голосов
/ 01 июля 2010

эй, я ищу чистое решение этой проблемы:

alt text

я запускаю цикл с i = 0, во втором шаге цикла i = 1, затем i = -1, а затем i = 2 и т. Д.

как правильно запрограммировать это с помощью цикла for?

Ответы [ 12 ]

27 голосов
/ 01 июля 2010
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
}

Должен делать то, что вы хотите

11 голосов
/ 01 июля 2010

Если вы не возражаете, чтобы внутренний цикл появлялся 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);
}
5 голосов
/ 01 июля 2010

Кажется, что в каждом цикле вы добавляете 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 к тому месту, где вы остановились.

edit это плохой ответ. но весело = D

(я добавил этот последний бит, потому что, как только я сделал это редактирование, кто-то отказался от меня = ()

3 голосов
/ 01 июля 2010

Всего одно сложение, одно вычитание и отрицание:

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)  
3 голосов
/ 01 июля 2010

Вот реализация в javascript

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

Надеюсь, это поможет.

2 голосов
/ 01 июля 2010

Я использовал функцию синуса:

for ($i = 0; $i < 10; $i++)
{
    echo round(0.5 * $i * sin((0.5 + $i) * M_PI))."\n";
}
1 голос
/ 01 июля 2010

Для чего это стоит, вот мое собственное толкование проблемы.

for (var i = 0; i > -8; i = (i<=0) - i) // arbitrary condition stops loop at -8
1 голос
/ 01 июля 2010

В этом цикле есть шаблон.Глядя на это в числовой строке - это выглядит так:

  • 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, которое идентично решению @ FallingBullet , но более эстетично на мой взгляд:)

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
...
1 голос
/ 01 июля 2010
        for (int i = 0; i < 10; i++)
        {
            int div = i / 2;
            int mod = i % 2;

            int offset = mod == 0 ? div : -div;
        }
0 голосов
/ 02 июля 2010

Я бы, наверное, пошел с:

for (var i = 0; i <= max; i = ( i <= 0 ) ? -i + 1 : -i)
{
    f( i );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...