- ベストアンサー
再帰について
こんばんは。 今、大学でC言語の勉強しているのですが、昨日再帰についての講義がありました。 講義の中で以下のプログラムを作成したのですが、このプログラムの 実行結果がなぜ以下のようになるか分かりません。 どなたかご教授ください。 結果:9 8 7 6 5 4 3 2 1 0 プログラム: #include<stdio.h> main() { function(0); } function(int i){ if(i<10) { function(i+1); printf("%2d",i); return i; } }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
0. 最初に、i=0 でfunction(0)を呼び出したとき、 function(0+1); printf("%2d",0); を実行して、function(1)を呼び出した後に、0を表示しなさいとなります。つまり 【function(1)を実行下結果】0 1. 次に、function(1)の実行を考慮すると、 【【function(2)を実行下結果】1】0 となります。 9. これを i=9まで繰り返すと、 【...【function(10)を実行下結果】9 】...8 7 6 5 4 3 2 1】0 10. 最後は境界(限界)の i=10でどうなるかをじっくり考えてみてください。 再帰のアルゴリズムの考え方は、慣れるまで繰り返し経験する必要と価値のある物です。
その他の回答 (4)
- redfox63
- ベストアンサー率71% (1325/1856)
以下のように変更してみると 関数の呼ばれ方が分かるかと思います #include <stdio.h> int myFunc(int); int main( void ) { myFunc( 0 ); return 0; } int myFunc( int i ) { // 引数の表示 printf( "i:%2d\n", i ); if ( i < 10 ) { myFunc( i + 1 ); // 本来のデータの表示 printf( "Data:%d\n", i ); } return i; } # 分かりやすくするために 引数/結果をすべて改行して表示しています
ざっと拝見したところ、結果はプログラムの記述どおりになっていますよ! ゆっくり言語でなくイメージ図やフローでもいいので書いて見れば答えはわかります。 C言語の中で再帰はかなり基本的なことだと思いますし、大学の授業で組んだのであれば、それなりの情報系とか工学系の分野を専攻されているのだと思います。 申し訳ありませんが、文学部卒でも理解できる内容ですし、答えをここで教えるのはこのサイトでの禁止事項(宿題の丸投げに相当する部分)がありますので、あえて答えは書きません。 ヒントとしてはfunction()の実行後どこに戻るのか?考えて見てください。 よろしくお願いいたします。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
function(8)から始めてみましょうか。 function(8) →function(9)を呼ぶ →function(10)を呼ぶ(なにもせずreturn) そして'9'を書いて戻る そして'8'を書いて戻る なので 9 8 と書かれます。 # function(7)でも考えてみて。 function(0)から始めると呼び出しの段数が増えるだけで同じこと。
- Tacosan
- ベストアンサー率23% (3656/15482)
プログラムの気持ちになってシミュレートすればわかる. 再帰のときに「同じ関数だ」と思ってしまうと混乱するかもしれないので, 「1回目に呼び出したときは function1, 2回目は function2, ...」と区別するといいかもしれない.