• ベストアンサー

再帰について

こんばんは。 今、大学で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; } }

質問者が選んだベストアンサー

  • ベストアンサー
  • auty
  • ベストアンサー率58% (284/486)
回答No.3

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)
回答No.5

以下のように変更してみると 関数の呼ばれ方が分かるかと思います #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; } # 分かりやすくするために 引数/結果をすべて改行して表示しています

noname#62605
noname#62605
回答No.4

ざっと拝見したところ、結果はプログラムの記述どおりになっていますよ! ゆっくり言語でなくイメージ図やフローでもいいので書いて見れば答えはわかります。 C言語の中で再帰はかなり基本的なことだと思いますし、大学の授業で組んだのであれば、それなりの情報系とか工学系の分野を専攻されているのだと思います。 申し訳ありませんが、文学部卒でも理解できる内容ですし、答えをここで教えるのはこのサイトでの禁止事項(宿題の丸投げに相当する部分)がありますので、あえて答えは書きません。 ヒントとしてはfunction()の実行後どこに戻るのか?考えて見てください。 よろしくお願いいたします。

回答No.2

function(8)から始めてみましょうか。 function(8) →function(9)を呼ぶ  →function(10)を呼ぶ(なにもせずreturn)   そして'9'を書いて戻る  そして'8'を書いて戻る なので 9 8 と書かれます。 # function(7)でも考えてみて。 function(0)から始めると呼び出しの段数が増えるだけで同じこと。  

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

プログラムの気持ちになってシミュレートすればわかる. 再帰のときに「同じ関数だ」と思ってしまうと混乱するかもしれないので, 「1回目に呼び出したときは function1, 2回目は function2, ...」と区別するといいかもしれない.

関連するQ&A

  • 再帰について(C言語)

    今、再帰処理を勉強しています。 しかし、以下のプログラムがどうしても理解できません。 流れ的には一体どういう手順になっているのでしょうか? return i * fact( i - 1 )の部分を考えると頭が こんがらがってしまいます。 #include <stdio.h> int main( void ){  printf("5の階乗は %d です", fact(5) );  return 0; } int fact( int i ){  if( i == 1 ) return 1;  else return i * fact( i - 1 ); } --------実行結果---------- 5の階乗は 120 です

  • 関数の再帰処理

    1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657... という数列(フィボナ数列)を再帰処理でだしたいのですが・・・・・ include <stdio.h> int function( int ); int main( void ){ int n; do { printf( "0 以上の整数値を入力して下さい→ " ); scanf( "%d", &n ); }while ( n < 0 ); printf( "計算結果: %d\n", function( n ) ); getchar(); getchar(); return 0; } int function( int n ){ //フィボナの処理(function)の再帰呼び出しによる } function内に再帰処理を用いてprintf( "計算結果: %d\n", function( n ) );で画面出力したいのですが・・・・・・。

  • c言語の再帰で(関数呼び出し)+1がわからない

    再帰がどのように処理されているのか理解するために、再帰の時に +1 してみたところ 0! = 1 1! = 2 2! = 5 3! = 16 4! = 65 5! = 326 6! = 1957 7! = 13700 8! = 109601 9! = 986410 10! = 9864101 となりました。 普通の階乗の値を求めた最後に +1され、それが戻されると思ったのですが違いました。 これはどういう処理がされているのでしょうか? #include <stdio.h> int kaijo(int); int main() { int i; for (i = 0; i < 11; i++) printf("%d! = %d\n", i, kaijo(i)); return 0; } int kaijo(int n) { if (n == 0) return 1; else return n * kaijo(n - 1) + 1; }

  • 再帰プログラム

    strに格納されている文字数を数えるプログラムです。 #include<stdio.h> int rstrlen(char *); int main(void) { char str[] = {"abcdefghijk"}; printf("文字数:%d\n",rstrlen(str)); return 0; } int rstrlen(char *p) { if(*p) { p++; printf(p); return 1 + rstrlen (p); } else return 0; } return 1 + rstrlen (p);の部分で再帰をし1をプラスすることにより文字数をカウントしmainのprintfで文字数を表示しているのですがカウントしている値はどこに格納していてどのようにmainに返しているのかが分かりませんでした。教えてください。

  • 再帰呼び出しについて(基本)

    #include <stdio.h> void dan(int i); void kuku(void); void dan(int i) { int j; for (j = 1; j <= 9; j++) printf("%3d", i*j); putchar('\n'); } void kuku(void) { int i; for (i = 1; i <= 9; i++) dan(i); } int main(void) { kuku( ); return(0); } というプログラムがあるのですが、danとkukuを再帰呼び出しにしたいのですが、再帰の仕方がまったく分かりません。 知り合いに聞くと、両関数の引数を1つずつ増やすとよいと言われたのですが、手をつけられない状態です。 よろしくご教授お願いします。

  • return 1

    #include<stdio.h> int fact(int num); int main(void) { int i; printf("Input figure freely:"); scanf("%d", &i); printf("%d", fact(i)); return 0; } int fact(int num) { if(num>0){ return num * fact(num-1); }else{ return 1; } } -------------------------------------------- 上のプログラムは再帰呼び出しを使った階乗計算の プログラムです。 func()関数内のreturn 1の意味をどなたか教えて いただけないでしょうか?

  • 再帰処理 変換

    初歩的で申し訳ないのですが、10進数を2進数に変換して表示する関数dt(n)を再帰的に定義するプログラムを作ってみたのですがつまってしまいました。以下、考えたコード文です。 #include <stdio.h> /*****dt*******/ long dt(int n) {      if(n == 1)          printf("1");      else          dt(n % 2);          printf("%d" , n); } /****** Main ******/ void main(void) {      dt(10); } どこが間違えているかご指摘頂けたら有難いです。

  • VC++ 再帰関数

    ■キーボードより読み込んだ文字列の長さを求めるプログラムを再帰関数を使って作る #include <stdlib.h> int unk_r(char*p)   {    if(*p == 0x00)    return(0);   else    return(1+unk_r(p+1));   } int main()   {    char *i;    i = (char *)malloc(20);    scanf("%s",i);    printf("%d\n",unk_r(i));   } このプログラムについて、行、単語ひとつひとつ細かいところまで具体的に解説お願いします。どういう働きをしているのか等。 例えば #include <stdlib.h> はmallocを使うのに必要などなど。 よろしくお願いします。

  • 再帰プログラム

    #include<stdio.h> int rstrlen(char*); int main(void) { char str[100]; printf("文字列を入力してください\n"); gets(str); printf("文字数は %d です\n",rstrlen(str)); return 0; } int rstrlen(char *p) { if(*p){ p++; return 1+rstrlen(p); } else return 0; } 文字数を計算するプログラムです。 if(*p)の*pとはNULLを表しているのですか?

  • C言語で再帰的処理が出来ない理由

    以下のサイトでC言語の勉強をしているのですが、このサイトのソースコードをコピペして実行してみたら上手くいきませんでした。 http://wisdom.sakura.ne.jp/programming/c/c30.html ========================== #include<stdio.h> void func(int ); int main() { func(0); printf("プログラムを終了します"); return 0; } void func(int max) { if (max <= 10000) { printf("%d\r",max); func(max + 1); } } ========================== 実行してみると、何故か4700~4800の辺りで止まってエラーになってしまいます。 どうしてエラーになるのでしょうか?

専門家に質問してみよう