0

基本上,这是作业中的最后一个问题,我很茫然。我需要创建一个交替 1 和 0 的 x x x 矩阵,其中 x 是用户输入。举个例子,如果用户输入 2,矩阵看起来像这样

0 1
1 0

如果用户输入 4,矩阵将如下所示

0 1 0 1
1 0 1 0
0 1 0 1
1 0 1 0

等等......我已经搜索了堆栈溢出和其他论坛,并且我了解如何创建一个数组。这只是交替的 1 和 0 以及如何显示它。感谢任何有任何想法的人。

4

4 回答 4

2

不要把事情复杂化。您不需要像,和之类的标志条件。这非常简单。boolif?:

var count = 4; // User specified matrix size
mat = []; // Empty array, to use as matrix.
for(var i=0; i<count; i++) {
    mat.push(new Array(count)); // Add a new row (reserved size) to the matrix
    for(var j=0; j<count; j++) {
       mat[i][j] = (i^j) % 2; // Insert an alternating 1 or 0 based on iteration.
    }
}
于 2012-08-08T05:19:39.377 回答
1

秘诀是将你的代码抽象成多个函数。如果将用于创建行的代码与用于创建矩阵的代码分开,则与将所有内容都塞进一个宏功能相比,您将更容易围绕正在发生的事情进行思考。

让我们先解决更简单的问题——创建一行。看起来您想要控制返回行的长度以及第一个单元格的初始值,无论是 1 还是 0。这需要一个带有两个参数的函数:

function makeMatrixRow(size, initialValue) { }

所需的代码非常简单:

function makeMatrixRow(size, initialValue) {
    var n = [];

    for (var i = 0, flag = !!initialValue;
             i < size;
             i++, flag = !flag) {
        n.push(0+flag+0);
    }

    return n;
}

我已将大部分逻辑推入 for 循环的定义中。解构应该不难。唯一棘手的位是“!!initialValue”和“0+flag+0”。第一个将 initialValue 转换为真/假值(布尔值)。第二个将此布尔值转换为数字。显然我不需要在两边都加零,但我喜欢它的对称性——而且我觉得这样看起来有点像杠铃:)

有了这个功能,生成矩阵就很容易了。不用摆弄嵌套循环。问题已简化为简单的迭代来填充数组:

function makeMatrix(size) {
    var matrix = [];
    for (var i = 0; i < size; i++) {
        matrix.push(makeMatrixRow(size, i % 2 == 0));
    }
    return matrix;
}

i % 2 == 0 正在测试均匀度。最好将其拆分为自己的变量赋值,而不是直接传递它。这里有一个额外的变量,或者可以充分替代注释:

for (var i = 0; i < size; i++) {
    var isEvenRow = (i % 2 == 0);
    matrix.push(makeMatrixRow(size, isEvenRow));
}

就是这样!现在,代码如下所示:

function makeMatrixRow(size, initialValue) {
    var n = [];

    for (var i = 0, flag = !!initialValue;
             i < size;
             i++, flag = !flag) {
        n.push(0+flag+0);
    }

    return n;
}


function makeMatrix(size) {
    var matrix = [];
    for (var i = 0; i < size; i++) {
        matrix.push(makeMatrixRow(size, i % 2 == 0));
    }
    return matrix;
}

即使它有点长,我更喜欢单一功能的解决方案......但每个人都有自己的!

于 2012-08-08T06:03:38.853 回答
1

您可以使用此功能:

function createArray(n) {
    var arr = [];                     // create new array
    var zeroStart = true;             // the first row should start with 0
    for (var i = 0; i < n; i++) {     // loop over n times
        arr[i] = [];                  // used because array is multidimensional
        var zero = zeroStart;         // starting zero should match the row start
        for (var j = 0; j < n; j++) { // again loop over n times
            arr[i][j] = zero ? 0 : 1; // if zero is true, assign 0; otherwise 1
            zero = !zero;             // negate the value of zero
        }
        zeroStart = !zeroStart;       // negate the value of the starting zero
    }
    return arr;                       // return the created array
}

可以这样调用:

createArray(6);                       // create 6x6 array
于 2012-08-08T05:19:10.210 回答
0
function mArray(num){
   var a = [];
   var b = false;
   for(var z=0; z<num; z++){
      a[z] = [];
      b = false;
      for(var i=0; i<num; i++){
         a[z][i] = (b)? 1: 0;
         b = !b;
      }
   }
}

那应该行得通。

mArray(4); // to create a 4x4 array
于 2012-08-08T05:18:38.853 回答