【问题标题】:looping in two directions在两个方向循环
【发布时间】:2011-03-10 12:51:47
【问题描述】:

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

我在第二个循环步骤中以i = 0 开始循环,然后是i = 1,然后是i = -1,然后是i = 2 等。

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

【问题讨论】:

  • 既然您要求具体的实现,那么您使用的是什么语言?

标签: php javascript loops for-loop


【解决方案1】:

如果你不介意让内循环出现 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);
}

【讨论】:

  • @antpaw whhhhyyyyyyyyy?除了最丑之外,它在处理方面也是最复杂和低效的。
  • +1。另一种可能的解决方案,如果我们没有随机访问但只能双向访问链表,甚至可能需要这样做,例如,使用两个迭代器(一个递减,另一个递增,并访问第一个元素开始)。
  • 您甚至可以将其“改进”为j/2 * -((j%2) * 2 - 1)
【解决方案2】:
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 形式优雅;您可能必须将 do_stuff 提取到单独的函数中以避免代码重复,否则它非常漂亮。
  • 这不是有效的 JavaScript 或 PHP。 var,不是int
【解决方案3】:

每个循环,您似乎都在添加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

(我添加了最后一点,因为我一进行编辑,就有人对我投了反对票 =( )

【讨论】:

    【解决方案4】:

    这是javascript中的实现

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

    希望对你有帮助。

    【讨论】:

    • 通过i=0;i&lt;10;i=(i&lt;=0&gt;1-i:-i)减少对数学的依赖
    【解决方案5】:
            for (int i = 0; i < 10; i++)
            {
                int div = i / 2;
                int mod = i % 2;
    
                int offset = mod == 0 ? div : -div;
            }
    

    【讨论】:

      【解决方案6】:

      我使用了正弦函数:

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

      【讨论】:

        【解决方案7】:

        对落弹解决方案的修改,将在没有特殊条件的情况下处理 0 索引情况。

        //do stuff with 0
        for(int i = 0; i< (arrayLength/2); i++)
        {
            //do stuff with i
        
            if(-i != i)
            {
                //do stuff with negIndex
            }
        }
        

        【讨论】:

          【解决方案8】:

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

          • 后退0步
          • 向前迈出一步
          • 向后退两步
          • 向前迈出 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
          ...
          

          【讨论】:

            【解决方案9】:

            在 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;
            }
            

            【讨论】:

              【解决方案10】:

              一加一减一负:

              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)  
              

              【讨论】:

                【解决方案11】:

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

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

                【讨论】:

                  【解决方案12】:

                  我可能会选择:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-10-20
                    • 1970-01-01
                    • 2019-09-16
                    • 2018-04-09
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多