• 締切済み

再帰

iが10以下の時、a ( i+1 ) ;の部分が実行され printf文は飛び越されますよね? iが10になると、if文は実行されませんよね。 実行結果は9876543210となるのですが、解りません。 どう読み込まれるのか解説お願いします。 a ( 0 ) の時、 void a(int i) {   if ( i<10 ){   a ( i+1 );   printf ( "%d",i );   } }

みんなの回答

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.4

実行される順に a(i){  a(i+1){   ...   printf(i+1)  }  printf(i) } という風に書くと a(0){  a(1){   a(2){    a(3){     a(4){      a(5){       a(6){        a(7){         a(8){          a(9){           a(10){            (ifの条件が偽なのでなにもしない)           }           printf(9)          }          printf(8)         }         printf(7)        }        printf(6)       }       printf(5)      }      printf(4)     }     printf(3)    }    printf(2)   }   printf(1)  }  printf(0) } これが上から順に実行されるので、最終的な表示が 9876543210 となります

startover
質問者

お礼

回答どうもありがとうございます。 if条件が偽、 printfで9876543210と戻ってくる所がわかるような、あやふやな感じなんですが、じっくり考えて見ます! ありがとうございました。

すると、全ての回答が全文表示されます。
  • herbest
  • ベストアンサー率42% (15/35)
回答No.3

もっとループ回数を減らして「if ( i < 1 )」ぐらいで 考えてみてはどうですか? もしくは次のように別関数として考えてみるとか。 void a(int i) {   if ( i < 2 ){   b ( i + 1 );   printf ( "%d",i );   } } void b(int i) {   if ( i < 2 ){   c ( i + 1 );   printf ( "%d",i );   } } void c(int i) {   if ( i < 2 ){   printf ( "%d",i );   } } イメージわきました?

startover
質問者

お礼

すばやい回答ありがとうございます。 ループの数を減らしてみると、なんとなくイメージがつかめました。 ループ数が増えると、解らなくなりますが。 再帰のなんとなくのイメージは解りました! ありがとうございます。

すると、全ての回答が全文表示されます。
  • crew21
  • ベストアンサー率26% (58/222)
回答No.2

No.1さんの仰る通りです。説明上手いなあ。。 再帰ってけっこうイメージしにくくて初心者にはひっかかるところなので、もしNo.1さんの説明で分からないようでしたら、随所にprintf分を入れて実行してみるといいですよ。 例えばa関数に入ってすぐの箇所でprintf("関数に入った iは%d\n", i);とか、関数から抜ける箇所でprintf("関数から抜ける iは%d\n", i);とかやるとプログラムの動きが見えやすくなります。 再帰は一つ間違うとメモリ(スタック)を食いつぶしたりするので、気を付けてくださいね。

startover
質問者

お礼

すばやい回答ありがとうございます。 随所にprintf分を入れて実行してみるといいですよ。 これはいいアイデアですね。 いろいろ試してみます。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

iが10未満のときprintfは飛び越されるのではなく a(i+1)を実行して帰ってきてから実行されます。 だから a(0), a(1), ..., a(9)ときてa(10)ではa(11)とprintfは実行されず 後は戻りながらa(9)のprintf、a(8)のprintf、と実行されます。 結果として9876543210と表示されることになるわけです。

startover
質問者

お礼

すばやい回答ありがとうございます。 よく理解を深めるため参考にさせていただきます。 ありがとうござうました。

すると、全ての回答が全文表示されます。

関連するQ&A