• ベストアンサー

再帰について

再帰を用いたプログラムと再帰を用いないプログラム では、プログラムの読みやすさや計算にかかる手間は どうちがうんでしょうか?

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

  • ベストアンサー
  • ametsuchi
  • ベストアンサー率31% (81/257)
回答No.1

1)プログラムの簡潔さ:再帰の方が遥かに簡潔でステップ数も少ない。 2)読みやすさ:モノによるでしょう。再帰と同じことはスタックを自分で管理すれば出来ます。これも結構分かり難い。 画像処理で「ラベリング」なんか考えると、再帰の方が遥かに楽で、「ラベリング」の定石通りに組むと結構大変で分かり難い。 3)計算時間:再帰は関数呼び出しのオーバーヘッドがかかります。以前、上の「ラベリング」処理で、 a)定石通り b)再帰 c)再帰と同じ仕掛けを自分でスタック管理で実現 と3つ比較しましたが、速い順にa)c)b)。しかもb)はスタックオーバーフロー連発でした。b)とc)に差が出たのは、「関数呼び出しのオーバーヘッド」しか考えられません。関数を呼び出すと、レジスタの内容なんか全部スタックに保存しますから...。

janne
質問者

お礼

どうもありがとうございました

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

その他の回答 (2)

  • ametsuchi
  • ベストアンサー率31% (81/257)
回答No.3

No.1の補足です。 ymmasayanさんの言われる、「ハノイの塔」は遊びに属しますし、「バイナリ・ソート」も「qsort」という便利で強力なものがある以上、自力でプログラム書いても勉強にしかなりません。学生さんならこれでいいでしょうが、社会人の場合は「実務に生かしてナンボ」の世界です。ymmasayanさんはあくまで例として出しただけなんでしょうが...。 私自身が実務で使った例を述べます。昔は再帰のできないFortanが主でしたから、Fortranで再帰でなければ書けない場合に限り、スタックを自分で管理して再帰プログラムを書きました。Cが普及してからは、そんな面倒なことしません。 1) 3D地形上にまばらに分布する数1000件の建物を管理する際、「balanced Quad Tree」を使用。このように深さの決らない階層的データ構造は事実上再帰でしか書けない。(Fortran) 2) CADで作られた車の自由曲面データをCAM用に多面体近似する際、トリム曲面を 「Binary Tree」で管理し、指定トレランス以内まで分割。これも再帰でないと無理。(Fortran) 3) 電波伝播解析用に2D,3D-RayTraceをした際、電波が反射・回折・透過などで分岐することを再帰で表現(C) 4) 地下の地層に石油がどのように溜まるかシミュレートする際の連続領域検出用に(C) 5) STL(Stereo Lithography)データをOpen-GLでSmoothShadingする際、近傍頂点グループの分類にBalanced Octreeを使用。数10万Polygonのため、総当たりだと日が暮れる。(C++)

janne
質問者

お礼

どうもありがとうございました

全文を見る
すると、全ての回答が全文表示されます。
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

一長一短があると言うことを説明したいので例えを使います。 鶴亀算を解くのに小学生なら鶴亀算の方がよくわかります。 しかし、高校生なら、2元1次方程式の方が理解しやすいでしょう。 再帰も初心者にとっては、はなはだ難しいですし、トリッキーですが、論理的に整然としていますので、ベテランにとっては、プログラムが短くて、わかりやすいでしょう。 計算にかかる手間は、おそらく再帰の方がかかっているのでしょうね。 ただ、注意しないといけないのは、再帰で解かなくても解ける問題を、無理矢理、再帰で解いて見せている例が多いことです。検証がし易いからと言う理由は判るのですが、本当に再帰でないと解くのが難しい問題(ハノイの塔など)をもっとPRすべきなのでしょうね。バイナリーソートなども、再帰を使うととても短いステップで書けますね。

janne
質問者

お礼

どうもありがとうございました

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

関連するQ&A

  • javaの再帰呼びについてお願いします。

    javaで nPn ,nCn 組み合わせ計算プログラムを 再帰呼びを使って 作成しようとしてますがとうやって書けばいいかわかりません。 初心者なんでわかりやすいコメントで お願いいたします

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

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

  • 再帰呼びだし

    再帰呼びだし 問題1 再帰呼び出しを用いてint型の配列({-9、8、-7、6、5、4、1、3、6、9、2、-14})の最小値を求めて出力するプログラムを作成せよ。関数名はmin_of_arrayとする。 問題2 同じく再帰呼び出しを用いてint型の配列({3、4、1、5、2})を小さい方から順番に求めて出力するプログラムを作成せよ。 再帰呼び出しが苦手で、じっくり解いていこうと思ったのですが、他の課題もあって、もう提出期限いっぱいいっぱいなので載せました。 どうかよろしくお願いします。

  • 再帰について

    一般的(?)に、フォルダ内にあるファイルをサブフォルダまで含めて表示するとき、再帰という方法を用いると思います。 フォルダのようなツリー構造の場合に、再帰を使わなくても表示できるプログラムは作れるのでしょうか? (BASIC等は再帰が使えないと聞いたのですが・・・) 考え方だけで良いので、アドバイスお願いします。

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

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

  • 再帰的処理について

    指定したURLのページのHTMLを取得しその中のリンクを再帰的に表示するプログラムを考えていますが再帰的な処理の部分がよく理解できません。教えて下さい。お願いします。

    • ベストアンサー
    • Perl
  • 再帰

    x=2のときの4次多項式 f(x) = 1x^4 + 2x^3 + 3x^2 + 4x + 5の解を ホーナー法、再帰を用いて計算せよ という問題(C言語)があるんですけど、よくわかりません。 ホーナー法を用いるということで、そこは自分で調べて (((1x+2)x+3)x+4)x+5となることはわかりました。 でもC言語で書けと言われてもどこをどう再帰で書けばいいのかわかりません。 わかる人だれか教えてください。お願いします。

  • 再帰アルゴリズム

    再帰アルゴリズムの練習のため問題に取り組んでいるのですが、問題集に解答がついておらずイマイチ理解できていないので教えていただけると助かります。 d個の毎インデックスで(0,0,...,0)から(n,n,...,n)まで反復させるアルゴリズムを反復アルゴリズムと再帰アルゴリズムの両方考えよ です。 (0,0,0,...,0) (1,0,0,...,0) (1,1,0,...,0) (1,1,.....,1) ... (n,n,.....,n) と表示を繰り返すプログラムでいいのかな、と思い反復の方は二十ループを用いてプログラムかけたんですが、再帰の法がアルゴリズムがどうも理解できていません。 ご教授願えればと思い、お願いします。

  • javaの再帰関数のフローチャート

    再帰プログラムを組むために、まずフローチャートを書こうと思ったのですが、再帰プログラムのフローチャートの書き方がわからなくなりました。 よかったら、わかりやすく回答よろしくお願いします!!

  • 再帰呼び出し

    C++のクラスで n!=n(n-1)(n-2)...1 n!を求めるprogramを作らなくてはならないのですが 再帰を使わずに、関数factorial(n)を使わないといけません。 ちんぷんかんぷんです。 for(counterとcounter--を使った)物しか思いうかびません。 関数factorial(n)を使うというのはnに戻るつまり再帰というふうには ならないのですか? 関数と再帰の意味を漠然としかわかっていないのですが。 よろしくお願いします。

中2の不登校の息子について
このQ&Aのポイント
  • 中2の息子が夏休み明けから不登校になりました。いじめや友達関係の問題はなく、学校へ行く理由を説明できないようです。
  • 息子はオンラインゲームに熱中しており、学校との折り合いをつけていましたが、不登校で生活リズムも乱れてきています。
  • 現在は適応教室に通っており、始めは頑張っていましたが、最近は行けなくなってしまっています。親として将来が不安で悩んでいます。
回答を見る

専門家に質問してみよう