繁体   English   中英

javascript增量数值数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM