循环向两个方向

时间:2010-07-01 08:54:55

标签: php javascript loops for-loop

嘿,我正在寻找这个问题的干净解决方案:

alt text

我在i = 0的第二个循环步骤中使用i = 1启动循环,然后i = -1然后i = 2等。

如何使用for循环以干净的方式对此进行编程?

12 个答案:

答案 0 :(得分: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
}

应该做你想做的事

答案 1 :(得分: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);
}

答案 2 :(得分: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

(我添加了最后一点,因为我做了那个编辑后,有人向我投了一个=()

答案 3 :(得分:3)

这是javascript中的实现

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

希望它有所帮助。

答案 4 :(得分: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)  

答案 5 :(得分:2)

我使用了正弦函数:

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

这个循环有一个模式。在数字线上看它 - 它就像:

  • 0步后退
  • 前进一步
  • 向后退两步
  • 前进3步
  • 向后退步

这是一个解决方案 - 在循环的每次迭代中保持递增步长,并且每次都翻转方向(向前/向后)。继续添加当前值。

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

答案 8 :(得分:1)

对于它的价值,这是我对问题的解释。

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

答案 9 :(得分: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
    }
}

答案 10 :(得分: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;
}

答案 11 :(得分:0)

我可能会选择:

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