再帰関数についての解説とF(5)の値

このQ&Aのポイント
  • 再帰関数についての知識がないため、詳しい解説と具体例が欲しい。
  • F(5)の値が何か知りたい。
  • なぜ=後の5×は残るのか説明してほしい。
回答を見る
  • ベストアンサー

再帰関数について

非負の整数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つ丁寧に解説して頂きたいです。 大変ご迷惑な質問かと思いますが、分かる方おられましたら、 お手数ですが、ご教授お願いします。 以上、よろしくお願い致します。

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

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

>そもそも再帰関数とは、どんなことを言っているのでしょうか。 http://ja.wikipedia.org/wiki/再帰 の「再帰呼出し」を参照。 >なぜ=後の5×は残るのでしょうか。 質問文のプログラムコードの実行過程は次のとおり。 (1a) 引数を5として関数F()を呼出し。その中でG(4)を使う (2a)  引数を4として関数G()を呼出し。その中でF(3)を使う (3a)   引数を3として関数F()を呼出し。その中でG(2)を使う (4a)    引数を2として関数G()を呼出し。その中でF(1)を使う (5)     引数を1として関数F()を呼出し。その戻り値は1 (4b)    F(1)の戻り値を得てG(2)を求める。その戻り値は2+1=3 (3b)   G(2)の戻り値を得てF(3)を求める。その戻り値は3×3=9 (2b)  F(3)の戻り値を得てG(4)を求める。その戻り値は4+9=13 (1b) G(4)の戻り値を得てF(5)を求める。その戻り値は5×13=65 イメージ程度の把握でよいのなら,下記URLの「nの階乗」のイラストを参照すればよいでしょう。 http://www.ced.is.utsunomiya-u.ac.jp/lecture/2004/prog/p1/debugger/factor.php 「5はどこに残っているのか,きちんと知りたい」のであれば,適当な再帰プログラムをデバッガを使って実行し,下記URLの内容を理解することになります。 http://ja.wikipedia.org/wiki/リエントラント (1a)(2a)(3a)(4a)(5)と進んでいく段階で,関数呼出しが発生するたびに戻り番地がスタックに積まれていることは分かりますか? 単純に言うならば,引数である5,4,3,2,1も関数呼出しのたびにスタックに積まれているのです。だから残っている。

wwmomo
質問者

お礼

ご回答ありがとうございました。 ご丁寧に説明して頂き、理解が出来ました。 当方、少し問題文を読み間違えていました。 また、各URLありがとうございます。 非常に役に立ちました。 以上、ありがとうございました。

その他の回答 (2)

  • higeG
  • ベストアンサー率22% (4/18)
回答No.3

再帰関数の動作原理を知るためには、スタックの概念と関数呼び出し時に引数やローカル変数がどの様にスタックを使用しているかを理解する必要があります。 この辺を理解した上で、もう一度再帰関数の解説を良く読んでみることをお勧めします。 それでも理解できない部分があれば補足で挙げて下さい。

wwmomo
質問者

お礼

ご回答ありがとうございます。 スタックの概念を勉強してから 再度ご質問させて頂きます。 以上、ありがとうございました。

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

「=後の 5×」がどこのことを指しているのかわかりませんが, 普通に計算するんだから残ってないとおかしいでしょ? それとも, あなたは 5×(3+2) = 3+2 = 5 という計算が正しいと信じている?

wwmomo
質問者

お礼

ご回答ありがとうございます。 当方、少し問題文を読み間違えていました。 「5×」が残るのは当たり前ですよね。 失礼しました。 以上、ありがとうございました。

関連するQ&A

  • 非負の整数nに対して次のとおりに定義された関数F(

    非負の整数nに対して次のとおりに定義された関数F(n),G(n)がある。F(5)の値は幾らか。  F(n): if n≦1 then return 1 else return n×G(n-1)  G(n): if n=0 then return 0 else return n+F(n-1) F(5)=5×G(5-1) G(4)=4+F(4-1) F(3)=3×G(3-1) G(2)=2+F(2-1) F(1)=1 ここからは式を遡ってF(5)の値を求めます。 G(2)=2+1=3 F(3)=3×3=9 G(4)=4+9=13 F(5)=5×13=65 という問題なのですが、なぜ当たり前のようにF(3) G(4) F(5)というふうにFとGを行き来するごとに数字が一個増えるのですか? よろしくお願いいたします。

  • ■ 再帰的な関数について ■

    以下URLに記載されている問題です。 f ( n ) : if n ≦1 then return 1 else return n + f ( n - 1 ) この読み方が分かりませんでした。 また、「f (5)」の値が15になる過程も詳しく解説頂ける方、よろしくお願いいたします。 http://情報処理試験.jp/FE21a-am/k08.html

  • 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を呼びだすようにせよ。 よろしくお願いします。

  • 再帰呼び出しの計算量

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

  • 再帰・組み合わせ

    新しく再帰という概念を習い始めたのですが、組み合わせを求めるやり方がわかりません 組み合わせの公式通り(nCk → n!/k!(n-k)!)、例えば4C2なら答えは6通りになるのはわかるのですが、 public static int combinations(int n, int k){ if(k==n){ return 1; }else if(k=1){ return n; }else if(0<k && k<n){ combinations(n-1, k-1) + combinations(n-1, k) ←これで出来るらしいのです } } combinations(n-1, k-1)は意味がわかるのですが、combinations(n-1, k)これが組み合わせの公式にどうあてはまっているのかがわからず、 そして何故足してるのかがよくわかりません。どなたかお解かりになればお願いします

    • ベストアンサー
    • Java
  • 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; }

  • 関数の再帰処理

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

  • 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を使うのに必要などなど。 よろしくお願いします。

  • 再帰

    お世話になります。再帰でどう組んだらいいのかわからない問題があるので質問させてください 問題は、再帰を使って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
  • 再帰的(リカーシブ)プログラムで質問があります。

    再帰的(リカーシブ)プログラムの所で質問があります。 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が代入されていくのでしょうか?