我知道这是一个非常愚蠢的问题,但我很难找到这个逻辑。我正在努力研究这个非常基本的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);
}
答案 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();
}
答案 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
。
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;
您可以将其包装在函数定义中以帮助重用:
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;
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++);
}
}
&#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;
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;
答案 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太贵了。
var firstID = 0;
var RangeSize = 12;
for (i = 0; i < 36; i++) {
if (i >= RangeSize * (firstID + 1)) {
firstID++;
}
console.log(firstID + " - " + i);
}