• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:再帰的(リカーシブ)プログラムの説明について。)

再帰的プログラムの説明とは?

Wap58の回答

  • Wap58
  • ベストアンサー率33% (29/87)
回答No.3

読み出すと呼び出すの意味合いはお好みでいいんじゃないですか >それより戻り場所が消える。に違和感があります 関数はrerurn文がなければ関数内の処理を終えた時点で 局所変数を含めてメモリー解放されます >戻り場所を記憶した記憶領域を参照して、 関数は処理の終了を目指し途中で別関数が呼ばれたら 処理を中断し別関数の処理が終わるのを待機します その為、再帰が深い程メモリーが必要になります

jamtgjpw37582
質問者

補足

(1) f(5)=5×f(4) (2) f(4)=4×f(3) (3) f(3)=3×f(2) (4) f(2)=2×f(1) (1)から(4)までの流れとしては、f(4)の値が未確定なので、f(5)が計算途中のままでf(4)の関数が呼び出され、同じようにf(4)もf(3)の値が未確定なので計算途中のままでf(3)が呼び出され、f(3)もf(2)の値が未確定なので、f(2)関数が呼び出され、f(2)もf(1)の値が未確定なので、 f(1)が呼び出される。 f(1)の値が1に確定すると、f(2)=2×f(1)が計算途中のままだったが、f(1)の値が確定したので、f(1)=1が参照されてf(2)=2×f(1)のf(1)が1になり、f(2)=2×1=2となりf(2)の戻り値は2になる。 また同じようにf(2)=2と値が確定したので、f(2)=2を参照し、計算途中のままであるf(3)=3×f(2)のf(2)が2と値が確定し、f(3)=3×2=6となり、f(3)の戻り値は6となる。 この流れを同じように繰り返してf(5)の戻り値は120になる。 このような流れの事をおっしゃっているという事でしょうか?

関連するQ&A

  • 再帰呼び出しを使いますか?

    趣味でプログラムをかじる程度なのですが、今まで自分はプログラムを作っていて再帰呼び出しを使ったことがありませんが、みなさんは良く使うのでしょうか? なかなか再帰呼び出しを考えるのが難しく自分のプログラムで適用すると良いところなど思い浮かびません。 再帰呼び出しをすると何か利点とかあるのでしょうか? 再帰呼び出しで無いと作るのが難しいプログラムなど今までありましたか?あればどんな処理だったかなど教えてください。

  • プログラム構造の「再帰的」について

    再帰的の説明に 「再帰的とは、あるプログラムがその内部から自分自身を呼び出して使用できる性質である。」「したがって再帰的であれば、必然的に再入可能でもある。」とありました。 ここで、「したがって再帰的であれば、必然的に再入可能でもある。」とは、つまり、プログラムAの中に再帰したプログラムA’が既に再入している状態にある、ということを表しているという理解かな?と思っているのですが、宜しいのでしょうか? より良い理解のために、補足説明などいただけたら、と思います。よろしくお願いいたします。

  • VC++ 再帰呼び出しについて

    VC++6.0にてプログラミングを行っているものですが、 関数の再帰呼び出しについて質問です。 再帰呼び出しの際にスタックに積まれる変数というのは、 再帰呼び出しをする関数に渡す引数のことですか? スタックオーバーフローを起こさないために、 staticなポインタにHeap領域上の 変数を割り当てるとよい。 と分かったのですが、 この意味は、例えば static int *a = new int; ということなのですか?

  • クイックソートの再帰呼び出し後の記述について(特に配列の範囲)

    アルゴリズムをすこしかじってみているのですが、いきなり躓いてしまいました。詳しい方にお聞きします。クイックソートの再帰呼び出し後のプログラムの記述がよくわかりません。(特に配列の範囲) QuickSort(Head,Tail)というプログラムがあるとします。最初の一連の処理が終わり、再帰呼び出しの部分で、 QuickSort(Head,Left-1)という前半部分を指定した再帰呼び出しとQuickSort(Right+1,Tail)という後半部分を指定した再帰呼び出しがされるとします。ここまでは分かるのですが、この再帰呼び出しのプログラムの実行を記述するとなるとどうなるのでしょうか?特に分からないのはこの再帰呼び出しでさらに再帰呼び出しされるQuickSortのカッコ内の配列の範囲がどのようになるのか、何か特別な記述はされるのかということです。あとソートの必要のないレベルまで来た場合の処理(記述)も分かりません。どなたかご教授願えないでしょうか?

  • 【C言語】再帰が時間がかかる理由について

    再帰のプログラムがなぜ時間がかかるのかを詳しく調べています。 アセンブリレベルで見ると、 callに時間がかかるのか?それともpop命令?それとも退避? 結局、よく分からないまま、 Google検索して調べています。(まだよくわかってません。) 再帰呼び出しのデメリットは、 スタック領域を大量に消費する、関数呼び出しのオーバーヘッドであること。 この事実はわかりました。 しかしながら、 オーバーヘッドとは具体的に何なのか これを調べています。 どなたか、良いサイト・書籍を知らないでしょうか。 教えてください。

  • 再帰呼び出しで求めたい経路を表示させたい!

    以前も「すべての経路を求めるには」というような質問をして再帰呼び出しにより無事解決することが出来ました。 しかし、少しわからないところがあります。 例えばaはb1とb2に接続されていてb1とb2はそれぞれc1,c2とc3,c4に接続されているとします。すべての経路は全部で4本ですね。 これを再帰呼び出しの中にprintf文を用いて表示させたところ a->b1->c1 c2 b2->c3 c4 というような感じで表示されたと思います。これは再帰呼び出しの性質で分岐があった以前の場所へ戻って探索を続けるからだというのは理解できました。しかし、実際は a->b1->c1 a->b1->c2 a->b2->c3 a->b2->c4 というように表示させたいです。何かこれを記憶するための変数が必要だと思うのですが、それを用いて上のように表示させるほう方法が思いつきません。 さらに、a->b2->c3というように特定の経路だけを選択して表示させたいです。アドバイスよろしくお願いします!

  • C言語における再帰呼び出しの限界?について

    お世話になります、AEと申します。 次のような件に悩まされています。 ○画像のラベリング処理において、再帰呼び出しによって塗りつぶし処理を行っているのですが、再帰の回数が多くなると途中でメモリリークによるものと思われるエラーが発生し処理が中断してしまいます。 #ただし、物理メモリを全部使い果たした様子はありません。 ソースコードやエラーメッセージを添付できず、漠然とした質問で大変心苦しいのですが、一般論として、 ○Windows上で開発したプログラムにおいては、再帰の回数(あるいは再帰呼び出しのために確保されるメモリ量)は有限なのでしょうか?また有限であったとしてそれを拡張する設定があるのでしょうか? ということについてご意見などいただければと思います。 **** 無論、プログラム自体の不具合によってメモリリークを引き起こしているんじゃないの?とか、そもそもメモリが足りてないんじゃないの?というご意見もあるかと思いますが、それは取り敢えずおいておいて、一般的な意見として、「メモリの許す限り何回でもいけるぞ!」とか「同じような経験をしたぞ!」とかいう意見を伺えれば幸甚です。 合わせて解決策がもしあるものでしたらご意見ください。 一般的なUNIXではlimitでユーザが使えるメモリ量を設定できると思うのですが、そういう類の設定がWindowsにもあるぞ!というご意見などもお待ちしております。 勉強不足で申し訳なのですが、よろしくお願いいします。

  • 再帰呼び出しになってしまうのをループの形にしたい

    VBで繰り返して実行するプログラムを作ったのですが、 スタック領域をオーバーしてしまいます。 再帰呼び出しになっているのはわかったのですが、 改善ができません。 簡略したら下記のような状態でした。 Sub test1()  test2 End Sub Sub test2()  test1 End Sub このtest1を実行して、繰り返し作動するようにしたのですが、 当然スタックオーバーフローになります。 簡単にループに変形できるのでしょうか?

  • プログラムを再帰的に実行させたい

    いつもお世話になっています。 ブログのトラックバック先のURLを取得するプログラムを作成しているのですが、 以下のようなプログラムを例において、 プログラムを再帰的に実行させたいです。 public class BlogTB { public static void main(String[]args){ String url1 = args[0]; String[] TBURL =HTMLTB.getHTMLtb(url1); for(int i=0;i<TBURL.length;i++){ System.out.println(TBURL[i]); } } HTMLTB.getHTMLtbでは、以前の質問の http://oshiete1.goo.ne.jp/kotaeru.php3?q=1725502 ご回答を参考にして作成した各ブログサービスごとに対応する トラックバック先のURLを取得する処理を行い、 HTMLをパースしてトラックバック先のURLを抽出し、 その一覧をTBURLに格納します。 例えば、ブログAの記事に、 B,C,D,E,Fのブログがトラックバックをしていたとすると、 上記のプログラムの結果として、ブログAのURLを入力すると、 B,C,D,E,FのブログのURLを表示するようになっています。 そこで、ブログAにトラックバックをしていたブログBにa,b,cのブログがトラックバックしていて、 同様にブログEにはd,eのブログがトラックバックをしていて、 さらにブログcにはブログ1,2がトラックバックをしていたとします。 このとき、B,C,D,E,FのブログのURLだけでなく、 a,b,cとd,eと1,2のブログのURLも取得したいと思っています。 つまり、プログラムを再帰的に動かして、 ブログAからたどれる全てのブログのURLを取得したいと思っています。 そのようにするには、上記のプログラムの中で、 どのような処理をさせればいいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • プログラムの構成について

    構成上どれがいいんでしょうか? 1.複数のプロセスで同時に実行できるようにしたプログラムは再帰的である。 2.逐次再使用可能なプログラムは、再入可能でもある。 3.再入可能プログラムはを実現するためには、プログラムを手続き部分とデータ部分に分割して、データ部分をプロセスごとにもつ必要がある。 4.再帰的処理のためには実行途中の状態をFIFO方式で記録し、制御する必要がある。