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)
小智 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)
这使用了两个循环语句,但老实说,无论你如何将它分离出来,它仍然使用相同数量的循环(即两个循环,每个循环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)
不像第一种方法那么聪明:
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)
| 归档时间: |
|
| 查看次数: |
4184 次 |
| 最近记录: |