4

我们有一个数值数组,每个元素都有任意最大值。我们如何增加元素以使数组从[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);
}
4

5 回答 5

1

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

于 2012-12-22T08:52:52.623 回答
0

您需要两个循环 - 每个maxes元素一个,目前有 4 个,但我不确定您是否打算将其更改为动态;另一个循环将增加每个元素的值,直到它从maxes.

于 2012-12-20T21:55:47.730 回答
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(", "));
}
于 2012-12-20T22:01:05.637 回答
0

几天前我重新审视了这个问题,并对代码进行了一些重构。

首先要正确理解这个问题,它相当于在一个混合基数系统中计数。在这个系统中,每个位置/数字都有一个任意基数。例如,如果所有最大值都是 2,那么问题将以 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

于 2013-07-27T10:00:51.583 回答
-1

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

于 2012-12-20T22:10:22.393 回答