如何编写一个for循环,它将从中断处获取计数?

use*_*146 18 javascript algorithm for-loop

我知道这是一个非常愚蠢的问题,但我很难找到这个逻辑.我正在尝试使用这个非常基本的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
Run Code Online (Sandbox Code Playgroud)

内环应该从切割第一个内环的数字开始.在第一次迭代中它停止了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);
}
Run Code Online (Sandbox Code Playgroud)

JMD*_*JMD 64

这里有几个"聪明"的答案.我坚持使用"简单易读,易于调试"的答案.这是C#中的解决方案,应该足够简单,可以翻译:

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

组织技能击败算法向导


Wak*_*erX 56

您不需要2个循环,您可以通过单个循环实现此目的:

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

如果你不喜欢Math.floor,你可以使用double bitwise not运算符来截断float:

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

  • 我没有看到这个实现比使用两个循环更好 - 基本操作的数量是相同的,除了现在你有一个计算密集的分区而不是简单的加法. (34认同)
  • @RobFarr它可以说更好,因为它比使用计数器的双循环解决方案更容易理解和推理(除非性能很重要). (3认同)
  • 我的意思是,如果你真的想要提高效率,你可以展开循环并减少而不是增量,但关键是它可以在单行中完成,只需一个循环,效率不高. (2认同)

小智 28

一圈

你不需要两个循环,因为你可以使用一些简单的数学.

使用模运算符(%)来查找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);
}
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

算法魔法的重要性 ;)

两个循环

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

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++); 
    }
}
Run Code Online (Sandbox Code Playgroud)


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

三个循环

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++); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

四!

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++); 
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 一个循环,两个循环,三个循环,四个! (10认同)

tal*_*myn 8

这使用了两个循环语句,但老实说,无论你如何将它分离出来,它仍然使用相同数量的循环(即两个循环,每个循环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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后用你需要的任何"计数"数字来调用它:

doubleLoop(3, 12);  //this would get you what you asked for in your question
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 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;
}
Run Code Online (Sandbox Code Playgroud)