2016-11-15 9 views
0

友だちの配列を再帰的に実行しようとしていますが、arr1[i][j] = arr2[j][i]の場合は1つの配列が別のもののフレンドですので、再帰的にしようとしましたが、最初の行のみを変更します。フレンドアレイの再帰

int friendArray[][] = { 
    {1,2,3,4}, 
    {5,6,7,8}, 
    {9,10,11,12}, 
    {13,14,15,16} 
}; 

friendArrayRecursive(friendArray, 0,0); 


private static void friendArrayRecursive(int[][] arr, int row, int col){ 
    if(row < arr.length){ 
     if (col < arr[row].length) { 
      arr[row][col] = arr[col][row]; 
      friendArrayRecursive(arr, row, col + 1); 
     } else { 
      friendArrayRecursive(arr, row + 1, 0); 

     } 
    } 
} 

しかし、出力の代わりに、BE:

1 5 9 13 
2 6 10 14 
3 7 11 15 
4 8 12 16 
のみ1つのアレイでそれを行う私は私が推測する2つの変更を作成することはできません同じアレイ上であることをしている意味、私はこれをしませんでした

です。
1 5 9 13 
5 6 10 14 
9 10 11 15 
13 14 15 16 

その他の値を保存して5などの2を変更するにはどうすればよいですか? nhouser9として

if(row >= arr.length) 
    return; 
if(col >= arr[row].length) 
    return; 
if(row < col) { 
    int temp; 
    temp = arr[row][col]; 
    arr[row][col] = arr[col][row]; 
    arr[col][row] = temp; 
    friendArrayRecursive(arr, row, col + 1); 
} else { 
    friendArrayRecursive(arr, row + 1, 0); 
} 

答えて

3

+0

それは私が必要なものです、ありがとう@循環! :Dは魅力のように動作します – Stuart2041

+0
+1

この比較を使用すると、アルゴリズムはcol circular

0

変更if条件では、一時変数を使用して値を交換する必要がある、と述べました。その後、もちろん、すべてのセルを通過すると、スワップは2回発生し、キャンセルされます。したがって、比較(col <行)のみを使用してアレイの半分を通過する必要があります。

private static void friendArrayRecursive(int[][] arr, int row, int col){ 
    if(row < arr.length){ 
     if (col < row) { 
      int temp = arr[row][col]; 
      arr[row][col] = arr[col][row]; 
      arr[col][row] = temp; 
      friendArrayRecursive(arr, row, col + 1); 
     } else { 
      friendArrayRecursive(arr, row + 1, 0);  
     } 
    } 
} 
+0

何が条件 – Stuart2041

+0

場合はStuart2041 –

+0

@行くことはありません、私は5のための2を変更することができますが、その後、私はあなただけの別のセルをコピーしている2 – Stuart2041