• ベストアンサー

再帰的な関数の作り方

C言語の勉強をしている初心者です。 まだまだ始めたばかりでよく分かっていない状態です。 再帰的な関数が便利そうな事が書かれているのをよく目にしますが、何が便利でどう作ればいいのか分かりません。 分かりやすく教えていただけませんか。

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

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

こんにちは、それほどクワシイわけではありませんが・・・ 再帰関数というのは簡単に言えば自分自身を呼び出す関数です。 分かりにくいのは確かですね。 階層になってる繰り返しの処理なんかに向いているんです。 実際に動かしてみるといいですよ。 ここにある例がわかり易いかも知れません。 http://nonbank.malmalserver.com/ それとサイトだけでなく、解説している本を読むのもお奨めです。

tasketeqq1
質問者

お礼

ありがとうです、やってみます

その他の回答 (3)

noname#217196
noname#217196
回答No.4

繰り返し似たような処理をすることで、結果を得られる場合、再帰関数を使うことでプログラミング記述が簡潔になる。一方で、再帰関数のネストが深くなりすぎるとスタックオーバフローエラーを起こす原因になるから、要注意。 再帰関数呼び出しをやめる終了条件を書き忘れたり再帰関数プログラムにバグがあって終了しないままスタックオーバフローエラーを起こしたり無限ループになったりも、初心者にはありがち。 C言語だとフィボナッチ数を求める関数を例にするのが多いと思う。 C言語 フィボナッチ 再帰、をキーワードにインターネット検索すれば具体例はわかると思うよ。

tasketeqq1
質問者

お礼

ありがとうです

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.3

「自分を呼ぶ」というのはややこしいかもしれません。 (わたしにはよくわかりませんでした) そこで、 「自分と同じ名前のコピーを呼ぶ」というのはどうでしょう。 つまり、 foo(){ foo'(){ foo'() foo''() } }

tasketeqq1
質問者

お礼

ありがとうです

  • neuron-x
  • ベストアンサー率52% (139/266)
回答No.2

簡単に言うと、自分で自分を呼び出す事です。リカーシブコールとも呼ばれます。 作り方は簡単で、例えば次のような形になります。 void foo() {   foo(); } どうですか。自分で自分を呼んで、それが更に自分を呼んで…と、これが再帰呼び出しです。 ただし、このままでは無限に呼び出しが行われ、そのうちオーバーフローしてエラー終了してしまいます。 そのため、実際には再帰呼び出しをする中で、それ以上自分を呼び出さない(ストッパーとなる)条件と一緒に使います。 int hoge(int x) {   if(x <= 1) return 1; // これ以上自分を呼び出さないための条件   return hoge(x-1) + hoge(x-2); } こんな感じです。 どんな処理でも再帰呼び出しを使えば可能とか便利というわけではありませんが、同じパターンの繰り返しや、階層をたどっていくような処理の場合は簡潔に記述できるようになります。 例えば、マトリョーシカ(ロシアの人形の中に人形が入っていて、更にその中に…というような感じ)を空けていく時を考えると分かりやすいと思いますが、空けて人形があれば、それをまた空けて…。人形が出てこなくなるまで空ける…というようなケースも1つの例として分かりやすいと思います。

tasketeqq1
質問者

お礼

なんとなくわかりました