• ベストアンサー

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

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

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

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

ご質問そのものではなく類似問題に対する解説ですが,解説ポイントはまったく同じです。 http://okwave.jp/qa/q6349909.html の私の過去の回答ANo.2 >イメージ程度の把握でよいのなら,下記URLの >「nの階乗」のイラストを参照すればよいでしょう。 で指示したイラストをご覧いただければ, 4→3→2→1と再帰関数を呼び出し続ける段階では,数値をスタックに積むだけで加算はおこなわれず, 1→2→3→4と再帰関数を戻り(return)続ける段階で,加算がおこなわれてることがイメージできるでしょう。

Dr_DAC
質問者

お礼

参考になりました。 ご回答いただき、ありがとうございました。

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

その他の回答 (1)

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.1

f ( n ) : if n ≦1 then return 1 else return n + f ( n - 1 ) nを引数とする関数はnが1以下なら1を返し、1より大きければn+f(n-1)を返す。 f(5)の時、最初は 5+f(4) が返されます。 このとき f(4) が呼ばれて 4+f(3) が返されます。 このとき f(3) が呼ばれて 3+f(2) が返されます。 このとき f(2) が呼ばれて 2+f(1) が返されます。 このとき f(1) が呼ばれて 1 が返されます。 結局 f(5)→5+f(4+f(3+f(2+f(1)))) となり、 f(1) で1が返されるので、2+f(1) は3が返され、 f(2) で3が返されるので、3+f(2) は6が返され、 f(3) で6が返されるので、4+f(3) は10が返され、 f(4) で10が返されるので、5+f(4) は15が返されます。

Dr_DAC
質問者

お礼

早速のご回答ありがとうございます。

Dr_DAC
質問者

補足

最後に5+4+3+2+1と計算する理由が分かりませんでした。 「結局」以下に解説されている内容が、その計算する理由かと思いますが、そこの所をもう少し分かりやすく解説して頂けたら助かります。 よろしくお願いいたします。

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

関連するQ&A

  • 再帰関数について

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

  • 非負の整数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を行き来するごとに数字が一個増えるのですか? よろしくお願いいたします。

  • 再帰的関数 2進数の1の個数

    f(x)=if x=0 then 0 else if divisible(x,2) then f(x/2) else f(x/2)+1 divisibleは2で割り切れる、x/2は整除です。2で割ったときの整数値 この式が、xを2進数であらわしたときの1の数を表す、というのですが、 式に数値を入れてみても、1の数にならず困っています。 ご指導いただけましたら幸いです。 よろしくお願い申し上げます。

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

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

  • 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; }

  • ■キャッシュメモリのアクセス時間の計算について■

    以下URLに記載されている問題です。 解説を読みましたが、理解できませんでした。 もう少し具体的に分かりやすい解説をご提供できる方、よろしくお願いいたします。 http://情報処理試験.jp/FE14a-am/k24.html

  • 再帰処理を用いて階乗を求めるプログラム

    こんにちは 再帰処理を用いて階乗を求めるプログラムについて の質問です。 以下のように考えたのですが、 まったく駄目なようです。 どこをどのように直したらいいのか いまいちわかりません。 どなたか教えて下さい。お願いします。 Private Sub CommandButton1_Click() Dim n As Integer 階乗する数 Dim f As Integer 階乗する数の階乗した値 n = Val(TextBox1)   Do While f > 1 KEISAN n, f Loop TextBox2 = f End Function Function KEISAN(n, f) If n <= 1 Then f = 1 Else f = n * f(n - 1) End If End Function

  • ■ 受注実績について ■

    以下URLに記載されている問題です。 解説を見たのですが、選択肢とマスタファイルとの関連が分かりませんでした。 分かり易い解説をして頂ける方、よろしくお願いいたします。 http://情報処理試験.jp/FE21a-am/k29.html

  • マルコフ過程とは?

    この問題の http://情報処理試験.jp/FE15a-am/k06.html 解説を読んでも理解できません。 この「マルコフ過程」について解説していただけませんでしょうか?

  • C言語でシグマで総和を求める関数を作りたい

    おかしな点がありましたらご指摘お願いします /* nの総和を求める関数 */ int sum(int n) { /*     n-1      */ /* f(n) + Σ f(i)  (n > 1) */ /*     i=1      */ /* f(1)      (n = 1) */ if (n > 1)  return n + (n - 1) * (n / 2); /* 直接総和を返す*/ else if (n == 1)  return 1; }

専門家に質問してみよう