2012-01-17 24 views
3

グリッド(2D配列)を完成させる方法がいくつあるかを調べるメソッドを記述する必要があります。再帰呼び出しでのカウント

グリッド内の動きは次のようである:[0] [0]この例のために
[array.[0][0]%10][array.[0][0]/10]又は[array.[0][0]/10][array.[0][0]%10]

のいずれかに移動し、次いで(例えば14など)が内部に番号を取ると開始 : [1][4]または[4][1]

アレイの最後(右下)に到達するまで。

私は配列の終わりまで到達することができます(すべての可能な方法) - 私の問題は、実際に何度も配列を終えた回数を数えることです - メソッドの外で変数を使うことはできません。再帰的。

これはコードです:

private static int howMany(int[][] array, int y, int x, int count) { 
    if(y+(array[y][x]%10) < array.length && x+(array[y][x]/10)< array[y].length && array[y][x]!=0) { 
     System.out.println("["+y+"]["+x+"] is: "+array[y][x]); 
     howMany(array, y+(array[y][x]%10), x+(array[y][x]/10),count); 
    } 
    if(y+(array[y][x]/10) < array.length && x+(array[y][x]%10)< array[y].length && array[y][x]!=0) { 
     System.out.println("["+y+"]["+x+"] is: "+array[y][x]); 
     howMany(array, y+(array[y][x]/10), x+(array[y][x]%10),count); 
    } 
    if(y==array.length-1 && x==array[y].length-1) count++; 
    return count; 
} 

これは明らかに間違っていると、最初の場所にあったものを、カウントが返されます、私は他の多くの方法を試みたが、無駄に... ここに完全なクラスが(とですテストするための配列):

link to full class

編集:彼らの助けのためのみんなに大きな感謝!

答えて

1

は、howManyへの各呼び出しから既に返されています。私はあなたがそれを保存する必要があると思う:

count = howMany(array, y + (array[y][x] % 10), x + (array[y][x]/10), count); 

は両方ifブロック内でこれを行います。私はあなたのリンクされたコードでこの変更を行い、期待される結果を得ました(3)。

+0

ありがとうございました。私はこれを使用しました(主に変更が少なくて済むため) –

0

配列の最後(右下)に達した場合は1を返し、それ以外の場合は1+howMany(array, newY, newX)を返します。あなたはカウントを保持し、毎回それを渡す必要はありません。機能はとても動作します:
1 + returned value of 2nd call =
1 + 1 + returned value of 3rd call =
1 + 1 + 1 + returned value of 4th call = ...というように。
最後に、結果として必要なコール数を取得します。

0

メソッドのシグネチャがintを返すので、適切なトラックに既に入っています。カウントを保持する変数を定義し、プライマリ再帰呼び出しでインクリメントする変数を定義し、に再帰メソッド自体の結果をに追加する必要があります。カウントを各再帰呼び出しに渡す必要はなく、削除する必要があります。

関連する問題