[英]javascript increment numerical array
我们有一个数值数组,每个元素都有任意的最大值。 我们如何递增元素,使数组从[0, 0, 0]
变为[x, y, z]
?
为了说明max数组是否为[2, 1, 2]
并且我们在[0, 0, 0]
处开始主数组,递增应该使主数组通过以下步骤:
[0, 0, 0]
[1, 0, 0]
[2, 0, 0]
[0, 1, 0]
[1, 1, 0]
[2, 1, 0]
[0, 0, 1]
[1, 0, 1]
[2, 0, 1]
[0, 1, 1]
[1, 1, 1]
[2, 1, 1]
[0, 0, 2]
[1, 0, 2]
[2, 0, 2]
[0, 1, 2]
[1, 1, 2]
[2, 1, 2]
我写了一个函数,一旦达到最大值1就停止递增。这是我的代码:
var maxes = [2, 1, 2];
var myArray = [0, 0, 0];
function step() {
for(var i = 0; i < myArray.length; i++) {
if(myArray[i] == maxes[i]) {
continue;
} else {
myArray[i] = myArray[i] + 1;
return;
}
}
return false;
}
for(j = 0; j < 100; j++) {
result = step();
if(!result) break;
console.log(result);
}
你需要两个循环 - 每个maxes
元素一个,当前有4个,但我不确定你是否打算将它改为动态; 和另一个循环,它将增加每个元素的值,直到它达到maxes
极限值。
你只需要解决一些问题:
var maxes = [3, 1, 2, 1];
var myArray = [0, 0, 0, 0];
function step() {
var changed = false;
for(var i = 0; i < myArray.length; i++) {
if(myArray[i] == maxes[i]) {
continue;
} else {
myArray[i] = myArray[i] + 1;
changed = true;
}
}
return changed;
}
for(j = 0; j < 100; j++) {
result = step();
if(!result) break;
console.log(myArray.join(", "));
}
这是一个更简单,更有效的解决方案:只需采用一个变量pos来存储数组中的当前位置。 一旦我们在当前位置达到最大值,我们将当前位置增加1,否则增加当前位置的值。 而这个过程你只是不断重复,直到pos达到最后一个值,最后一个值是最大值。
var maxes = [3, 1, 2, 1];
var myArray = [0, 0, 0, 0];
var pos = 0;
while (pos < myArray.length - 1 || myArray[pos] < maxes[pos]) {
if (myArray[pos] >= maxes[pos]) {
myArray[pos] = 0; // to set it back to zero
pos++;
continue;
}
myArray[pos]++;
// Step code here
}
适用于任何大小的数组。 这是一个jsfiddle
公平披露:这是我自己的问题。 我无权访问我的SO或电子邮件登录,并使用刚为朋友创建的新帐户发布此问题。 我不是在回答这个问题,也不是他的答案。 我也不会让我的朋友将我的答案标记为已接受。 无论如何,我解决了这个问题,并最终通过这个工作代码:
var maxes = [4,1,2,3];
var pattern = [0,0,0,0];
function step() {
var t = false;
for(var k = 0; k < pattern.length; k++) {
t = t || (pattern[k] < maxes[k]);
}
if(!t) return false;
for(k = 0; k < pattern.length; k++) {
if(pattern[k] < maxes[k]) {
pattern[k]++;
return true;
} else {
pattern[k] = 0;
continue;
}
return false;
}
}
console.log(pattern);
var r = true;
while(r) {
r = step();
console.log(pattern);
}
JSBin 在这里 。
我几天前重新审视了这个问题,并重新编写了一些代码。
首先要正确理解问题,它相当于在混合基数系统中计数。 在这个系统中,我们每个位置/数字有一个任意的基数。 如果所有最大值都是2,例如问题那么将在base-2中计数,但是每个位置的最大值可以是不同的数量,因此, 混合基本系统。
中心功能实际上非常简单:
// increment in hyper system
function incr(maxes,num,digit) {
num[digit] = num[digit] + 1;
num[digit] = num[digit] % (maxes[digit]+1);
if(num[digit] === 0) incr(maxes,num,digit+1);
}
这是一个有效的jsbin 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.