回答(4件)

>再帰の流れがどうしても理解できません その本は勉強のための本ではなく試験対策本なので、再帰の勉強をしたければC言語の教科書を買った方がいいです。 試験対策本は勉強用には作られてないです。試験の対策をするための応用問題の解き方のコツが載ってるだけです。

この回答はいかがでしたか? リアクションしてみよう

プログラミングにおいて『再帰』とは、サブルーチンや関数が自分自身をコールすることです。 当然、ただコールし続けたのでは無限ループに陥りますから、そのサブルーチンや関数には「自分自身を呼び出さない条件」が設定されています(その例題ではk>n)。そして、その条件に一度でも合致すると再帰は一気に最初期のコールにまで戻り、結果すべての処理を終了します。

binaryNumber~に関して、問題文では binaryNumber が一つしかありません。 ですが、これを binaryNumber1 と binaryNumber2 と binaryNumber3 と binaryNumber4 と binaryNumber5 とを作って、binaryNumber は binaryNumber1 を、binaryNumber1 は binaryNumber2 を、binaryNumber2 は binaryNumber3 を、というように、再帰ではなく良く似た別の関数を呼び出すように書き変えてみると、流れが解ってくるのではないでしょうか。

>特に中段の、binaryNumber〜のところの繰り返しが・・ ⇒ それはつまり、「再帰呼出し」のトレースが出来ないと言うこと 再帰呼出しのポイント ・暗黙の復帰(return;)がコード可読性を妨げる ・(基本は呼出し時に)局所変数であること ・・深度が変化する都度別の領域にアサインされるので可読性を妨げる ・・復帰時に復帰後深度の値と言うことに注意する ・・特に2つ再帰が並んで居るときに要注意 ※広域変数の扱いは通常関数時に同じ ※ 例えば、 k = k1,k2,k3,k4... みたいして考える(トレース)。 再帰呼出しをすると、    k3 ⇒ k4 復帰すると   k4 ⇒ k3 この状態で更に再帰呼出しすると   k3 ⇒ k4 void binaryNumber(int k) {     if (k > n) {         printBin();         return;      //★暗黙の復帰     } else {         bin[k] = 0;  // ← α         binaryNumber(k + 1);         bin[k] = 1;  // ← β         binaryNumber(k + 1);         return;      //★暗黙の復帰     } } ━

画像