質問: i + 1; } jyun(tbl, 4); return(0); } ``` ### 試したこと 紙に配列tblがどのように変化したかを書いたのですが、書いていく内に数が多くなり、どの配列の部分にどの変数が入ってどういう数が格納されたか、今プログラムのどの部分にいるのかとこんがらがってしまいました。 以前アドバイスして頂いたように図を書いてみようかとも思ったのですが、どういう風に図を書いていいのかがまず分からず、行き詰ってしまいました。 熟練者の皆様はこういった関数を理解する時にどのように考えられているのか、是非、教えていただければと思います。
回答: * 全部一度に展開しようとせずに、まず前後の呼び出しとの関係性を見る。 * 終了条件から見る。 とわかりやすくなります。 今回の場合は、再帰呼び出ししなくなるときはn=1です:jyun(t,1) やることは、 tを表示します。 次にn=2を考えてみます:jyun(t,2) このとき、k=1、i=1,0です。 やることは、各iについて t[k]とt[i]を入れ替えて、jyun(t,1)を呼び出し、t[k]とt[i]を入れ替えます。 t={a,b,c,d}だったとすると、 jyun({a,b,c,d},1) jyun({b,a,c,d},1) を呼び出して、 tはt={a,b,c,d}に戻ります。 次にn=3を考えてみます:jyun(t,3) このとき、k=2、i=2,1,0です。 やることは、各iについて t[k]とt[i]を入れ替えて、jyun(t,2)を呼び出し、t[k]とt[i]を入れ替えます。 t={a,b,c,d}だったとすると、 jyun({a,b,c,d},2) jyun({a,c,b,d},2) jyun({c,b,a,d},2) を呼び出して、 tはt={a,b,c,d}に戻ります。 (jyun(t,2)の呼び出し前後でtの順番は元通りになるので、 結局jyun(t,3)の呼び出し前後でも順番は元通りになります。) n=4も同様に考えると jyun({a,b,c,d},3) jyun({a,b,d,c},3) jyun({a,d,c,b},3) jyun({d,b,c,a},3) を呼びます。 今までの結果から 例えばjyun({a,b,c,d},3)を展開していくと ``` jyun({a,b,c,d},3) jyun({a,b,c,d},2) jyun({a,b,c,d},1) {a,b,c,d}を表示 jyun({b,a,c,d},1) {b,a,c,d}を表示 jyun({a,c,b,d},2) jyun({a,c,b,d},1) {a,c,b,d}を表示 jyun({c,a,b,d},1) {c,a,b,d}を表示 jyun({c,b,a,d},2) 省略 ```