【问题标题】:How to write a for loop that will pick up a count where it left off?如何编写一个 for 循环,它会从它停止的地方开始计数?
【发布时间】:2015-08-18 06:25:06
【问题描述】:

我知道这是一个非常愚蠢的问题,但我很难找到这个逻辑。我正在尝试使用这个非常基本的 for 循环来实现这个结果

0 - 0
0 - 1
0 - 2
0 - 3
0 - 4
0 - 5
0 - 6
0 - 7
0 - 8
0 - 9
0 - 10
0 - 11

1 - 12
1 - 13
1 - 14
1 - 15
1 - 16
1 - 17
1 - 18
1 - 19
1 - 20
1 - 21
1 - 22
1 - 23

2 - 24
2 - 25
2 - 26
2 - 27
2 - 28
2 - 29
2 - 30
2 - 31
2 - 32
2 - 33
2 - 34
2 - 35

内循环应该从第一个内循环被切断的地方继续。 在第一次迭代中,它在11 停止,第二次进入内部循环时,它应该从12 - 24 开始,依此类推。

var count = 0;
var val = 0;
for(i = 0; i < 3; i++) {
    for(j = 0; j < count + 12; j++) {
        console.log(i + " - " + j);       

    }
    val = j;
    count = count + j;
    console.log(count);
}

【问题讨论】:

  • 你每次都从零开始。

标签: javascript algorithm for-loop


【解决方案1】:

这里有几个“聪明”的答案。我会坚持使用“易于阅读且易于调试”的答案。这是 C# 中的一个解决方案,应该很容易翻译:

int k = 0;
for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 12; j++)
    {
        Console.WriteLine(i + " - " + k++);
    }
    Console.WriteLine();
}

Organizational Skills Beat Algorithmic Wizardry

【讨论】:

    【解决方案2】:

    你不需要2个循环,你可以用一个循环来实现:

    for (var i = 0; i < 36; i++){
      console.log(Math.floor(i/12) + " - " + i);  
    }
    

    如果你不喜欢 Math.floor,你可以使用双位非运算符来截断浮点数:

    for (var i = 0; i < 36; i++){
      console.log(~~(i/12) + " - " + i);  
    }
    

    【讨论】:

    • 这里不需要Math.floor
    • 我看不出这个实现比使用两个循环更好 - 基本操作的数量是相同的,除了现在你有一个计算密集的除法而不是简单的加法。
    • 我的意思是,如果你真的想提高效率,你可以展开循环并减少而不是增量,但关键是它可以在单行中通过单个循环完成,而不是高效.
    • 但是你是对的我不会在需要尽可能优化的node js应用程序中使用它。
    • @RobFarr 这可以说更好,因为它比带有计数器的两循环解决方案更容易理解和推理(除非性能很重要)。
    【解决方案3】:

    一个循环

    您不需要两个循环,因为您可以使用一些简单的数学运算。

    使用取模运算符(%)求i除以12的余数,如果没有余数,则递增n,否则继续。

    由于0 在技术上是十二的倍数,(0 是一切的倍数)你需要从负一开始n

    function demo(n, i) { document.body.innerHTML += n + ' ' + i + '<br>'; }
    
    var x = 12, y = 3, l = (x * y), n =-1; 
    for(var i = 0; i < l; ++i) {
        if(i % x === 0) ++n;
        demo(n, i);
    }

    您可以将其包装在函数定义中以帮助重用:

    function demo(n, i) { document.body.innerHTML += n + ' ' + i + '<br>'; }
    
    function loopMultiples(l, x, callback) {
        var n =-1
        for(var i = 0; i < l; ++i) {
            if(i % x === 0) ++n;
            callback(n, i);
        }
    }
    loopMultiples((12*3),12, demo);

    The importance of algorithmic wizardry ;)

    两个循环

    如果你想使用两个循环,无论出于何种原因,它应该看起来像这样:

    function demo(i, n) { document.body.innerHTML += i + ' ' + n + '<br>'; }
    
    var n = 0, x = 12, y = 3;
    for(var i = 0; i < y; ++i) {
        for(var j = 0; j < x; ++j) {
            demo(i, n++); 
        }
    }

    以下是对以下评论的回应。我想不出在正常生产代码中使用以下任何一种方法的理由(除非你试图混淆某人),但它们确实返回了预期的结果。

    三个循环

    function demo(i, n) { document.body.innerHTML += i + ' ' + n + '<br>'; }
    
    var n = 0, x = 6, y = 3, z = 2;
    for(var i = 0; i < y; ++i) {
        for(var j = 0; j < z; ++j) {
            for(var k = 0; k < x; ++k) {
                demo(i, n++); 
            }
        }
    }

    四个!

    function demo(i, n) { document.body.innerHTML += i + ' ' + n + '<br>'; }
    
    var n = 0, w = 2, x = 3, y = 3, z = 2;
    for(var i = 0; i < y; ++i) {
        for(var j = 0; j < z; ++j) {
            for(var k = 0; k < z; ++k) {
                for(var l = 0; l < x; ++l) {
                    demo(i, n++); 
                }
            }
        }
    }

    【讨论】:

    • 一圈,二圈,三圈,四!
    【解决方案4】:

    这使用了两个循环语句,但老实说,无论你如何拆分它,它仍然使用相同数量的循环(即两个循环,每个循环 3 和 12 次或一个循环循环 36 次...... . 36 次循环)。

    它还带有参数,以支持不同的计数:

    function doubleLoop(outerCount, innerCount) {
        for (i = 0; i < outerCount; i++) {
            var currentOffset = (i * innerCount);
    
            for (j = 0; j < innerCount; j++) {
                console.log(i + " - " + (currentOffset + j));
            }
        }
    }
    

    然后只需使用您需要的任何“计数”数字来调用它:

    doubleLoop(3, 12);  //this would get you what you asked for in your question
    

    【讨论】:

      【解决方案5】:

      不如第一种方法聪明:

      var majorCount = 3;
      var minorCount = 12;
      var counter = 0;
      
      for(var i = 0; i < majorCount; i++) {
        for (var x = counter; x < counter + minorCount; x++) {
          console.log(i + " - " + x);
        }
        counter += minorCount;
      }
      

      【讨论】:

      • 基本相同,x == k == counter+j。您仍然使用两个“重复 N 次”循环。
      【解决方案6】:

      如果你不想使用两个循环并认为 math.floor 太贵了。

      http://jsfiddle.net/rdh5mv59/

      var firstID = 0;
      var RangeSize = 12;
      for (i = 0; i < 36; i++) {
          if (i >= RangeSize * (firstID + 1)) {
              firstID++;
          }
          console.log(firstID + " - " + i);
      }
      

      【讨论】:

        猜你喜欢
        • 2016-11-02
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多