基本上,这是作业中的最后一个问题,我很茫然。我需要创建一个交替 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 以及如何显示它。感谢任何有任何想法的人。
基本上,这是作业中的最后一个问题,我很茫然。我需要创建一个交替 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 以及如何显示它。感谢任何有任何想法的人。
不要把事情复杂化。您不需要像,和之类的标志或条件。这非常简单。bool
if
?:
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.
}
}
秘诀是将你的代码抽象成多个函数。如果将用于创建行的代码与用于创建矩阵的代码分开,则与将所有内容都塞进一个宏功能相比,您将更容易围绕正在发生的事情进行思考。
让我们先解决更简单的问题——创建一行。看起来您想要控制返回行的长度以及第一个单元格的初始值,无论是 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;
}
即使它有点长,我更喜欢单一功能的解决方案......但每个人都有自己的!
您可以使用此功能:
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
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