0

基本的に、これは課題からの最後の質問であり、私は真剣に途方に暮れています。1と0を交互に繰り返すx行x列の行列を作成する必要があります。ここで、xはユーザー入力です。たとえば、ユーザーが2を入力すると、マトリックスは次のようになります。

01
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

この機能を使用できます:

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 に答える
1

その秘訣は、コードを複数の関数に抽象化することです。行を作成するためのコードを行列を作成するためのコードから切り離すと、すべてを 1 つのメガファンクションに詰め込むよりも、何が起こっているかについて思考問題を簡単にまとめることができます。

最初に、行の作成という簡単な問題に取り組みましょう。返される行の長さと、最初のセルの初期値 (1 か 0 か) を制御したいようです。これは、2 つのパラメーターを受け取る関数を呼び出します。

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" だけです。1 つ目は、initialValue を true/false 値 (ブール値) に変換します。2 番目は、このブール値を数値に戻します。明らかに、両側にゼロを追加する必要はありませんでしたが、その対称性を楽しんでいます-さらに、このようにバーベルのように見えると思います:)

その機能があれば、行列の生成は簡単です。ネストされたループをいじる必要はありません。問題は、配列を埋めるための単純な反復に縮小されました。

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 に答える
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 に答える