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

时间:2015-06-03 20:45:41

标签: 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

内环应该从第一个内环切割完成的数字开始。 在第一次迭代中,它在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);
}

6 个答案:

答案 0 :(得分:64)

有几个&#34;聪明&#34;答案在这里。我坚持使用简单的阅读和简单的调试&#34;回答。这是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

答案 1 :(得分:57)

您不需要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);  
}

答案 2 :(得分:28)

一个循环

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

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

由于0在技术上是十二的倍数,(0是所有内容的倍数),您需要在负一点开始n

&#13;
&#13;
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);
}
&#13;
&#13;
&#13;

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

&#13;
&#13;
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);
&#13;
&#13;
&#13;

The importance of algorithmic wizardry;)

两个循环

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

&#13;
&#13;
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++); 
    }
}
&#13;
&#13;
&#13;

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

三个循环

&#13;
&#13;
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++); 
        }
    }
}
&#13;
&#13;
&#13;

四!

&#13;
&#13;
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++); 
            }
        }
    }
}
&#13;
&#13;
&#13;

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

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

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

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

答案 5 :(得分:2)

如果你不想使用两个循环,并认为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);
}