javascript增量数值数组

时间:2012-12-20 21:52:08

标签: javascript

我们有一个数值数组,每个元素都有任意最大值。我们如何递增元素以使数组从[0, 0, 0]变为[x, y, z]

为了说明最大数组是[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);
}

5 个答案:

答案 0 :(得分:0)

你需要两个循环 - 每个maxes元素一个,当前有4个,但我不确定你是否打算将它改为动态;以及另一个循环,它将增加每个元素的值,直到它达到maxes的极限值。

答案 1 :(得分:0)

你只有一些错误可以解决:

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(", "));
}

答案 2 :(得分:0)

这是一个更简单,更有效的解决方案:只需使用一个变量 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

答案 3 :(得分:0)

公平披露:这是我自己的问题。我无权访问我的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 here

答案 4 :(得分:0)

我几天前重新审视了这个问题,并重新编写了一些代码。

首先要正确理解问题,它相当于在混合基数系统中计数。在这个系统中,我们每个位置/数字有一个任意的基数。如果所有最大值都是2,例如问题那么将在base-2中计数,但每个位置的最大值可能是不同的数字,因此, hybrid 基本系统。

中心功能实际上非常简单:

// 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