- ベストアンサー
再帰的な関数の作り方
C言語の勉強をしている初心者です。 まだまだ始めたばかりでよく分かっていない状態です。 再帰的な関数が便利そうな事が書かれているのをよく目にしますが、何が便利でどう作ればいいのか分かりません。 分かりやすく教えていただけませんか。
- ggggggggggg hhhhhhhhhhh(@tasketeqq1)
- お礼率69% (213/306)
- C・C++・C#
- 回答数4
- ありがとう数4
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは、それほどクワシイわけではありませんが・・・ 再帰関数というのは簡単に言えば自分自身を呼び出す関数です。 分かりにくいのは確かですね。 階層になってる繰り返しの処理なんかに向いているんです。 実際に動かしてみるといいですよ。 ここにある例がわかり易いかも知れません。 http://nonbank.malmalserver.com/ それとサイトだけでなく、解説している本を読むのもお奨めです。
その他の回答 (3)
繰り返し似たような処理をすることで、結果を得られる場合、再帰関数を使うことでプログラミング記述が簡潔になる。一方で、再帰関数のネストが深くなりすぎるとスタックオーバフローエラーを起こす原因になるから、要注意。 再帰関数呼び出しをやめる終了条件を書き忘れたり再帰関数プログラムにバグがあって終了しないままスタックオーバフローエラーを起こしたり無限ループになったりも、初心者にはありがち。 C言語だとフィボナッチ数を求める関数を例にするのが多いと思う。 C言語 フィボナッチ 再帰、をキーワードにインターネット検索すれば具体例はわかると思うよ。
お礼
ありがとうです
- maiko0318
- ベストアンサー率21% (1483/6970)
「自分を呼ぶ」というのはややこしいかもしれません。 (わたしにはよくわかりませんでした) そこで、 「自分と同じ名前のコピーを呼ぶ」というのはどうでしょう。 つまり、 foo(){ foo'(){ foo'() foo''() } }
お礼
ありがとうです
- neuron-x
- ベストアンサー率52% (139/266)
簡単に言うと、自分で自分を呼び出す事です。リカーシブコールとも呼ばれます。 作り方は簡単で、例えば次のような形になります。 void foo() { foo(); } どうですか。自分で自分を呼んで、それが更に自分を呼んで…と、これが再帰呼び出しです。 ただし、このままでは無限に呼び出しが行われ、そのうちオーバーフローしてエラー終了してしまいます。 そのため、実際には再帰呼び出しをする中で、それ以上自分を呼び出さない(ストッパーとなる)条件と一緒に使います。 int hoge(int x) { if(x <= 1) return 1; // これ以上自分を呼び出さないための条件 return hoge(x-1) + hoge(x-2); } こんな感じです。 どんな処理でも再帰呼び出しを使えば可能とか便利というわけではありませんが、同じパターンの繰り返しや、階層をたどっていくような処理の場合は簡潔に記述できるようになります。 例えば、マトリョーシカ(ロシアの人形の中に人形が入っていて、更にその中に…というような感じ)を空けていく時を考えると分かりやすいと思いますが、空けて人形があれば、それをまた空けて…。人形が出てこなくなるまで空ける…というようなケースも1つの例として分かりやすいと思います。
お礼
なんとなくわかりました
関連するQ&A
- 再帰関数のインライン展開
再帰関数のインライン展開は出来るのでしょうか? もし、出来るようならアセンブラではどのように表現されているんですか? C以外の言語でも、再帰関数のインライン展開が出来るプログラム言語があれば教えてください。
- ベストアンサー
- C・C++・C#
- C++でforや再帰関数を使わずに、総当りする方法はありますか?
C++等で、forを使わず、再帰関数を使わずに多量のループで総当りする方法はありますでしょうか? 自己末尾再帰関数というのがネットで出てきますが、C言語系では使えないみたいです。 再帰関数で変数を全てスタティックにしても、関数の多重呼び出しで容量を食ってプログラムが動かないほどの計算をこなす必要があるのですが、こういった多数の桁のやり方になれておらず、先が見えません… また、全部をforにするのも、桁が大きすぎて問題があります。 どなたかご教授くださいますと幸いです。
- ベストアンサー
- C・C++・C#
- 再帰関数のサポートについて
http://ja.phptherightway.com/pages/Functional-Programming.html 上記ページにありますようにPHPは再帰関数をサポートとあります。 関数プログラミングなるものはこの再帰関数を使ってループをつくったりすると ききました。 たとえば function roop($i){ print($i); $n = $i + 1; if($n < 100){ roop($n); } } roop(1); というようなコードでしょうか。 これは1~99までのループですよね。 これはPHPがインタープリターといえど、一度 PHP専用のバイトコードに変換して からPHPエンジンがバイトコードを実行するため再帰が可能という解釈でもんだいないですかね? もしほんとうに逐次解釈なインタープリターなら解釈途中に、その関数自体の定義をインタープリターが認識? し終わる前に未定義状態の関数が出現してしまうってことですよね? undefined な関数があるといようなエラーがでてくのでしょうか? 生Cのソースみればわかるのでしょうけれども、私はCがわからないので・・・。 概要でよいのでご教授ください。
- ベストアンサー
- PHP
- 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を呼びだすようにせよ。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C言語で、再帰呼び出しを使用せずに、文字列"(12 + 3) * (
C言語で、再帰呼び出しを使用せずに、文字列"(12 + 3) * ( 3 * (4 + 5 ))"を、優先順位が低い順に二分木に入れる関数を作成したいのですが・・・。 char str[15] = ""(12 + 3) * ( 3 * (4 + 5 ))";なら char n[100];に n[0] = '*' n[1] = '+' n[2] = '*' n[3] = 12 n[4] = 3 n[5] = 3 n[6] = '+' n[7] = \0 n[8] = \0 n[9] = \0 n[10] = \0 n[11] = \0 n[12] = \0 n[13] = 4 n[14] = 5 (n[15] 以降は\0が格納されています。) というように入れたいのですが関数からその関数を呼び出す再帰を使わずに作成する方法がわかりません。 再帰を使用しなければかなり処理が複雑になるような気がしますがどなたか詳しい方よろしくお願いします。 言語はC言語です。
- ベストアンサー
- C・C++・C#
- PythonVer3の再帰について
現在、再帰について勉強しています。 関数のステートメントブロックの中に同じ関数を2か所使った場合の、処理される順番がよく解りません。 そこで、プログラムが表示されている状態で、Enterキーを押す毎に1行ずつ処理が進んで行き、今どの行が働いたかが分る様なソフト又は方法がないでしょうか。 よろしくお願いいたします。
- ベストアンサー
- その他(プログラミング・開発)
- c言語の再帰について教えてください。
c言語を勉強してるんですが、再帰のイメージがなかなかつかめません。 例えば、入力した文字列を逆から一文字ずつ表示させるのには どうしたらいいのか教えてください! 入力:ABCDE E D C B A ソースで処理される順序など説明等していただけたらうれしいです。
- ベストアンサー
- C・C++・C#
- javaの再帰関数を用いるプログラミング
1セント,10セント,25セントのコインを好きな枚数使う事ができる. 1234セントを支払う時最低何枚で払うことが出来るか?再帰関数を用いて現実的な速度で動くプログラムをjavaを使って作ってください! どうぞ宜しくお願いします!
- ベストアンサー
- Java
お礼
ありがとうです、やってみます