3

さて、これはここでの私の質問への補遺であり、答えられました。

前の質問の答えを安くしたくなかったので、私はこれが私の最初の質問に答えたJB Nizetに公平にそれ自身の質問を持つべきであると決め、そのようなことで信用を得ました。

クラスの2次元データ構造を実装しています。使用されるアプローチは、オブジェクトの「NxN」配列です。

それで、

Cell[][] dataStructure = new Cell[N][N];

各セルは、その左側のセルとその上のセルの出力に依存して、独自の出力を作成します。2次元構造は、入力範囲000〜111でテストされます。

2次元構造の例と出力が次のセルにどのように流れるか

ここに画像の説明を入力してください

例:

標準のX、Y方向を想定して、次の方法を使用して右下のセルの出力を取得しようとします。

/**
 * Recursive method that returns the output of a given cell
 * @param row: the row the cell is in (its yPos)
 * @param inputs:
 * @param column: the column the  cell is in (its xPos)
 */
private int[] getOutput(int[] inputs,int yPos, int xPos){
        if (yPos==-1){
              int[] out = new int[2];
              out[0] = 0;  // yPos
              out[1] = inputs[xPos];  //xPos
              return out;
            }
        else if (xPos==-1){
              int[] out = new int[2];
              out[0] = inputs[yPos];  //yPos
              out[1] = 0;  //xPos
              return out;
        }

        int[] leftOutput = getOutput(inputs, yPos, xPos-1);
        int[] topOutput = getOutput(inputs, yPos-1, xPos);

         return currentStructure[yPos][xPos].getResult(leftOutput[1], topOutput[0]);
}

簡単にするために、2次元構造のセルに対して指定された入力に対してロジックを実行する単一のgetResultメソッドがあります。結果は、各方向に1つずつ、2つの出力のint[]になります。

getResultメソッドは、現在のところ、次のように記述されています。

    public int[] getResult(int left, int top)
{
    int[] resultOut = new int[2];
    if (xDirStr.equals("00")){ // AND
        resultOut[0]= left * top;
    }
    if (xDirStr.equals("01")){ // OR
        if (left ==1 || top ==1)
               resultOut[0]= 1;
        else
       resultOut[0] =0;;
    }
    if (xDirStr.equals("10")){ // NOT, USES ONLY NOT X
        if (left ==0)
       resultOut[0]= 1;
        else
        resultOut[0]= 0;
    }
    if (xDirStr.equals("11")){ // XOR
        if ( (left==1 && top==0) || (left==0 && top==1))
            resultOut[0]= 1;
        else
        resultOut[0]= 0;
    }

    if (yDirStr.equals("00")){ // AND
        resultOut[1]= left * top;
    }
    if (yDirStr.equals("01")){ // OR
        if (left ==1 || top ==1)
               resultOut[1]= 1;
        else
        resultOut[1]= 0;
    }
    if (yDirStr.equals("10")) { // NOT, USES ONLY NOT X
        if (left ==0)
        resultOut[1]= 1;
        else
        resultOut[1]= 0;
    }
    if (yDirStr.equals("11")) { // XOR
        if ( (left==1 && top==0) || (left==0 && top==1))
            resultOut[1]= 1;
        else
        resultOut[1]= 0;
    }
        return resultOut;
}

ステップバイステップでデバッグしましたが、問題を見つけることができません。出力は、それを確認するために手作業で再作成したものと一致しません。出力は常に0です。役立つヒントがあれば幸いです。

私の具体的な質問は、getOutputが常に0を返すのはなぜですか?私がデバッグしていることから、問題は私のロジックアプリケーションにはなく、ここには含まれていません。

再度、感謝します。

======= UPDATE========BevynQの要求によるサンプル3x3。

左端と上端に沿った入力は、各テスト中に変化します。この例は、基本ケース000の場合です。** NOT関数は、常に左から入力する値の論理否定を返します。*私が試みている「出力」私のメソッドをチェックインするには、赤で囲まれています。

000の3x3の例

4

1 に答える 1

1

ユーレカ、それはとても単純だったので、私はそれを見落とし、それを捕まえませんでした。この問題は主に、変数名の選択が不十分であることに関連しています。私はおそらく間違った配列出力を持っていることをいじくり回しましたが、解決策はリターンラインを次のように変更することでした:

     return currentStructure[xPos][yPos].getResult(leftOutput[1], topOutput[0]);

違いを見ます?xPosとyPosを交換しました。デバッグ中に一瞬理解しましたが、その説明はまた頭の中で失われています。これは、最初にyPositionを必要とし、次にxPosition ...を必要とする構造へのアクセスに関連しています。これは、私たち全員が知っていて愛している標準(xy)表記の反対です。

于 2012-12-04T06:05:16.357 に答える