Как написать цикл 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);
}
Ответы
Ответ 1
Здесь есть несколько "умных" ответов. Я бы придерживался "простого для чтения и простого отладки" ответа. Здесь решение в С#, которое должно быть достаточно простым для перевода:
int k = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 12; j++)
{
Console.WriteLine(i + " - " + k++);
}
Console.WriteLine();
}
Организационные навыки Beat Algorithmic Wizardry
Ответ 2
Вам не нужно 2 цикла, вы можете достичь этого с помощью одного цикла:
for (var i = 0; i < 36; i++){
console.log(Math.floor(i/12) + " - " + i);
}
Если вам не нравится Math.floor, вы можете использовать оператор double bitwise not для усечения float:
for (var i = 0; i < 36; i++){
console.log(~~(i/12) + " - " + i);
}
Ответ 3
Один цикл
Вам не нужны два цикла, потому что вы можете использовать некоторую простую математику.
Используйте оператор modulo (%
), чтобы найти остаток i
, деленный на 12
, если нет остатка, increment 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);
}
Ответ 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));
}
}
}
Затем просто назовите его любыми номерами "count", которые вам нужны:
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;
}
Ответ 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);
}