再帰処理の「出口(戻り値)」について

このQ&Aのポイント
  • 再帰処理とは、関数内で自身の関数を呼び出す処理のことです。
  • 出口(戻り値)とは、再帰処理が終了する条件や、処理結果を返す箇所のことです。
  • 質問のプログラムでは、再帰関数Faが再帰関数Fbを呼び出し、Fbが再帰関数Fc、Fd、Feを呼び出しています。最終的に再帰関数Feで終了条件に合致した場合に戻り値を返しています。
回答を見る
  • ベストアンサー

出口(戻り値) 再帰処理

情報処理を独学で勉強しています。4月の初級シスアドに合格して,元々初級シスアドの午前を基本情報技術者の参考書で勉強していて,基本情報技術者の午前が70%ぐらいとれるようになってきたので,午後の勉強を「基本情報技術者 午後 完全合格教本」という本を買って始めました。 タイトルの「出口(戻り値)」この関数を呼び出したプログラムに戻り値を返すというのが再帰処理(再帰を使わないn!プログラム)の中でどうゆう処理をしているかが分かりません。 ○ プログラム名:再帰なしnの階乗 ○ 整数型 : 答 ・答 ← Fa(5) ・表示命令(答)     {答の内容を表示する} ○関数名: Fa(n) ○整数型: ANS ▲ n>1 | Yes |    ・Ans←n*Fb(n-1) ◇ No   |    ・Ans←1 ▼ ・出口(Ans)   (1) これがFa(n)がFb(n),Fc(n),Fd(n),FbがFcFdFe同じのが3回続きます。その後に ○関数名: Fe(n) ○整数型: ANS ▲ n=1 | Yes |    ・Ans←1 ▼ ・出口(Ans)   (2) となります。 参考書の実行の様子というのを見ると、最初は出口(Ans)をずっととばして最後の(2)のところまで来て戻るみたいになっているんですが、何がどこに戻ってどうなっているか、私の知っている知識の中で説明ができる方、よろしくお願いします。

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

  • ベストアンサー
noname#50176
noname#50176
回答No.1

Ans←n* Fb(n-1) の Fb(n-1)= Ans と思ってください。 つまり Fe(1) で 出口(Ans) の返し値処理を抜けると Fd>Fc>Fb>Fa の逆順で n * (n * (n * (n * (n * 返り値)))) となると思われますよ。 つまり呼び出し元の F?(n)のオペランドに戻ってきている と考えればいいでしょう。

yoshikon
質問者

お礼

補足質問をしようと文章を考えているうちになんとなく分かってきました。ありがとうございました。

関連するQ&A

  • 再帰呼び出し

    C++のクラスで n!=n(n-1)(n-2)...1 n!を求めるprogramを作らなくてはならないのですが 再帰を使わずに、関数factorial(n)を使わないといけません。 ちんぷんかんぷんです。 for(counterとcounter--を使った)物しか思いうかびません。 関数factorial(n)を使うというのはnに戻るつまり再帰というふうには ならないのですか? 関数と再帰の意味を漠然としかわかっていないのですが。 よろしくお願いします。

  • C言語 再帰呼びだし

    C言語 再帰呼びだし 問題が解けません。もしよろしければご指導お願いします。 フィボナッチ数を求めるプログラミングを作成せよ。 非負の整数nに対するフィボナッチ数Fnは以下のように再帰的に定義される。 Fn=0 (n=0の時) Fn=1 (n=1の時) Fn=F(n-1)+F(n-2) (n>1の時) ・関数int fibo(int n)を作成し、関数mainで、複数のnに対して関数fiboを呼びだし、その結果を表示せよ。 ・関数fiboは、再帰的にfiboを呼びだすようにせよ。 よろしくお願いします。

  • 関数の再帰処理

    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 ) );で画面出力したいのですが・・・・・・。

  • 再帰関数について

    非負の整数nに対して次のように定義された 関数F(n),G(n)がある。F(5)の値はいくらか。 関数 F(n):if n=<1 then return1 else return n×G(n-1) G(n):if n=0 then return0 else return n+F(n-1) (1)50 (2)65 (3)100 (4)120 正解 (2)65 以下解説 F(5):5×G(5-1)=5×(G(4))    =5×(4+F(4-1))=5×(4+(F(3)))    =5×(4+(3×G(3-1)))=5×(4+(+3×G(2))))    =5×(4+(3×(2+F(2-1))))=5×(4+(+3×(2+F(1)))))    =5×(4+(3×(2+(1))))    =65 再帰関数についての知識が皆無なので 教えて頂きたいのですが、なぜ=後の5×は残るのでしょうか。 そもそも再帰関数とは、どんなことを言っているのでしょうか。 具体例を挙げて頂くか、分かり易いURLを教えて頂けると幸いです。 お手数ですが、上記について1つ1つ丁寧に解説して頂きたいです。 大変ご迷惑な質問かと思いますが、分かる方おられましたら、 お手数ですが、ご教授お願いします。 以上、よろしくお願い致します。

  • 再帰

    お世話になります。再帰でどう組んだらいいのかわからない問題があるので質問させてください 問題は、再帰を使ってlong型の整数に、3つずつの間隔でコンマを入れString型で返す演習問題です。 例) 999 → 999 1234 → 1,234 1007 → 1,007 1023004567 → 1,023,004,567 public static String intWithCommas(long n) { String strnum = String.valueOf(n); String str = ""; int length = strnum.length(); if (strnum.length() <= 3) { return strnum; } else { str = "," + strnum.substring(length-4, length-1); } return str + intWithCommas(?); } 上記のように組んだのですが、2箇所わからないところがあります。 カンマを入れるので整数を文字列に変換してsubstringで3つずつに分けてカンマを入れようと思ったのですが、 str = "," + strnum.substring(length-4, length-1); この部分をどのように直したらいいかがわかりません。 これではカンマが一番左に行ってしまうし、整数を3つずつにわけようにも、本来インデックスは左から数えますがこの場合は右から3つずつ数えなければなりません。 それと、最後の再帰を呼ぶところですが、intWithCommas(?);の中をどうしたらいいかがわかりません。 long型の整数を受け取ってるのでlong型の整数を入れるとおもうのですが、プログラムの中で整数をStringに変換してるのでどうしたらよいのでしょうか 宜しくお願いします。

    • ベストアンサー
    • Java
  • 再帰処理 変換

    初歩的で申し訳ないのですが、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); } どこが間違えているかご指摘頂けたら有難いです。

  • 再帰関数squares()で完全平方根を帰す

    整数のint nを受け取り、 最初からn個の完全平方根を大きい順で返す再帰関数を教えてください。 完全平方根 1(1*1)、4(2*2)、9(3*3)などです。

  • scanf関数の戻り値について

    --------------------------------------- #include<stdio.h> int main(void) { int dt; while(scanf("%d",&dt)==1){ if(dt==0){ printf("0は入力しないでください\n"); puts(""); } else if(dt<0){ dt=-dt; printf("入力値の絶対値は「%d」です\n",dt); puts(""); } else{ printf("入力値の絶対値は「%d」です\n",dt); puts(""); } } return 0; } --------------------------------------- 以上のプログラムについて疑問があります。 scanf関数の戻り値が1の間、繰り返すというもので、入力の時に整数入力ですが、あえて実数である1.1を入れたとします。 scanfの戻り値は1で、dtには整数部の1だけ設定されていたので、これでもうまくいくのかと思ったのですが、次の入力はscanfの戻り値が0になっていて出来ませんでした。 何故0になっているのかわかりません。 入力バッファに何か残ってしまっているということなのでしょうか? 以上教えていただけると嬉しいです。

  • 再帰的(リカーシブ)プログラムで質問があります。

    再帰的(リカーシブ)プログラムの所で質問があります。 f(n):if n≦1 then return 1 else return n×f(n-1) n=5の場合、 (1) f(5)=5×f(4) (2) f(4)=4×f(3) (3) f(3)=3×f(2) (4) f(2)=2×f(1) (5) f(1)=1 結果としてf(5)=120 上記に対して質問があります。 質問1 f(5)の戻り値は、"5×f(4)"で合ってますでしょうか? 質問2 (1)から(2)に移行する流れとして、(1)のf(5)の処理による戻り値が、5×f(4)となり、この戻り値のf(4)によって引数の値が4であるf()関数が再び浮かび上がるというか、立ち上がるというかそういったイメージで(2)に移行するという考え方で合ってますでしょうか? 質問3 (1)の段階ではまだf(4)の値は確定していませんし、(2)の段階ではまだf(3)の値は確定していないように、(1)(2)(3)(4)までは値が確定せず、(5)の段階でf(1)の値が1に確定し、(4)(3)(2)(1)の順番でそれぞれf(2)、f(3)、f(4)、f(5)、の値が確定していき、最終的にf(5)=120になるのだと思いますが、この(4)(3)(2)(1)の戻っていく手順ってどこにそういった命令があるのでしょうか? それとも、f(1)=1となった段階で、f(1)になっている部分に自動的に1が代入されていくのでしょうか?

  • 再帰呼び出しの計算量

    再帰呼び出しを用いた関数の計算量を求める方法がわからないので質問させていただきます. xのn乗を再帰呼び出しを用いて求める関数に関して,計算量を求める問題なのですが,どのような方針で求めればよいのでしょうか? int exponent(int x, int n) {   if(n == 0){     return 1;   }else{     return x * exponent(x, n-1);   } } exponentがn回呼ばれるからO(n)というのは間違いでしょうか?

専門家に質問してみよう