Java の問題ではなく、単なるアルゴリズムの問題ですが、考え方は、 1. 順列から1つずつ順に数字を取っておく。 2. 残りの数字がまだあれば、それに対して再帰的に処理をする。 3. そうでなければ、取っておいた順を1つの解とする。 これだけの話です。なんと「1つずつ取っておく」という処理が要素を交換してくれるので、どこで入れ替えているのか謎という不思議なプログラムになります。ソースを見た方が早いですね。空白が消えてしまうので見辛いですが。 // テスト用, 配列の初期化 public final void test() { int[] right = new int[9]; for (int i = 0; i < 9; i++) { right[i] = i + 1; } int[] left = new int[0]; permutation(left, right); } // 再