2016-03-21 17 views
1

コードは次のとおりです。Javaは、単一の番号を返すように私にできるので2D配列内の要素の位置を返す再帰的

int rowCount = 0; 
int columnCount = 0; 
Pair p = new Pair(0, 0); 
public Pair search2D(int[][] data, int element) { 
    if(data[rowCount].length==columnCount) 
     { 
      rowCount++; 
      columnCount=0; 
     } 

     if(data.length > rowCount) 
     { 
      if(data[rowCount][columnCount] == element) 
      { 
       p = new Pair(rowCount, columnCount); 
      } 
      else 
      { 
       columnCount++; 
       search2D(data, element); 
      } 
     } 
     return p; 
} 

「対」は、私が書いたクラスであります私は要素の位置を保持するインデックスを返そうとしています。私の主な方法で

、Iは

int[][] table = new int[][] { {3, 2, 8}, {3, 5, 6} }; 
    System.out.println(r.search2D(table, 5)); 
    System.out.println(r.search2D(table, 8)); 

しかしながら、出力の両方が(1,1)であるています。私はループを使用しないように言われています、誰かが正しい方向に私を指すことができるか、問題がどこにあるか教えてください?

+0

@FallAndLearnはエラーを発生しませんが、テーブル内の8の位置は(1,1)ではありません。 – Nick

+0

rowcountとcolumncountはどこで初期化されていますか? – FallAndLearn

+0

メソッドrowCountおよびcolumnCountが定義されていない場合、それらはどこにありますか? –

答えて

2

r.search2D(table, 5)が見つかったら、rowcountcolumncountの値はリセットされません。したがって、r.search2D(table, 8)についても、1,1と答えています。機能を変更し、この問題を克服するために

public Pair search2D(int[][] data, int element, int rowcount, int columncount){} 

ここでsearch2D(data,element,0,0);

+0

これは最もクリーンなソリューションです。 – TheMirrox

+0

きれいで宿題をしません。別のヒントは、再帰呼び出しの戻り値を使用して検索を停止/継続することです。 * Countを* Indexまたは* Subscriptにリネームします。 –

+0

@FallAndLearnこれらの変更を行った後、私のメソッドのsearch2D(data、element、0,0)行にスタックオーバーフローエラーが発生しています。 – Nick

0

として呼び出すには、私はトリックを行うべきだと思いバージョンです。通常、グローバル変数に依存しない方が良い設計です。

public Pair search2D(int[][] data, int element) { 
    return search2D(0, 0, data, element); 
} 

public Pair search2D(int i, int j, int[][] data, int element) { 
    if (i == data.length) { 
     return new Pair(-1, -1); 
    } 
    if (j == data[i].length) { 
     return search2D(i + 1, 0, data, element); 
    } 
    if (data[i][j] == element) { 
     return new Pair(i, j); 
    } 
    return search2D(i, j + 1, data, element); 
} 

アップデート:私は、これはあなたが必要な助けないかもしれないことを今参照してください。あなたのコードを動作させる助けが必要でした。しかしこれを代替実装として使用すると、再帰の力のいくつかが示されます。 :)

0

私は再帰部分を考慮していませんでしたが、最初の検索後にrowCountとcolumnCountがリセットされず、メソッドが最初に両方とも0になるように変更する必要があります。

public Pair search2D(int[][] data, int element) { 
    return search2D(data, element, 0, 0); 
} 

public Pair search2D(int[][] data, int element, int rowCount, int columnCount) { 
    //your method 
} 

また、再帰のない方法も簡単です。

public Pair search2D(int[][] data, int element) { 
    for(int row = 0; row < int.length; row++) 
     for(int col = 0; col < int[].length; col++) 
      if(data[row][col] == element) return new Pair(row, col); 
    return new Pair(-1, -1); 
} 
+0

これは私の答えが言うものです。 2つの同じ答えを追加する必要は何ですか – FallAndLearn

関連する問題