質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Python

    8490questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Ruby

    7894questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Python 3.x

    6831questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Perl

    460questions

    Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

再帰関数を理解する方法を教えてください

受付中

回答 3

投稿

  • 評価
  • クリップ 2
  • VIEW 1,888
退会済みユーザー

退会済みユーザー

再帰関数を理解する方法を教えてください
何故か再帰というアルゴリズムを知ったときこれは絶対に使いこなさなければならない。という謎の使命感におそわれてもう4ヶ月くらいサイトを漁って勉強して、ここでも何回質問して回答してくださる方にも迷惑をかけたのに、未だに簡単なものしか書けません。そして読めません
読む順序がどうしてもわからないのです。
こんなに勉強しているのに理解できないのはどう考えても僕の頭のスペックの問題だとしか考えられません。どうしても理解したいんです。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

高校数学で習う「数学的帰納法」は理解していますか?
理解していなかったら、まずそこからですかね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/04 00:45

    いつもありがとうございます
    諦めたくないので初心に戻って勉強してみます。
    本当にありがとうございます

    キャンセル

  • 2015/07/04 01:14

    再帰を理解するために数学的帰納法が必須というわけじゃ無いですが、数学的帰納法であれば、高校生向けのわかりやすいテキストがあるだろうということからのアドバイスです。

    「数学的帰納法は十分使いこなせるが、再帰関数は理解できない」というのは考えにくいので。

    キャンセル

+2

再帰処理の基本は、 
   1. 問題を、少し解きやすい問題の組み合わせで表現する。
   2. 一番解きやすい問題を実際に解く。
です。
階乗計算、フィボナッチ数、 ハノイの塔, フラクタル図形、 クイックソート、フォルダーの階層表示
といった問題を再帰でプログラミングするときに、このことを念頭においてみてください。

フォルダーの階層表示をプログラムできますか?
 (windows のコマンドの tree, linux の tree コマンドのことです)
以下では フォルダーの階層表示について この観点ですこし考えてみます。

問題の分解:
----------
  1. フォルダー名を表示する。
  2. フォルダーにあるファイル名を表示する。
  3. サブフォルダがあれば、 (そのフォルダー名、そのフォルダーにあるファイル名を表示する) を行う。

 3 番の処理が、再帰になります。
 (いま 解こうとしている問題と同様の処理になります。
  でも階層が1つ 少なくなっているので すこし解きやすくなっているはず。)

解きやすい問題:
---------------
 サブフォルダがなければ、
    フォルダー名を表示する。
   フォルダーにあるファイル名を表示する。
 だけです。これは簡単にかけるはず。
 
参考:
- ディレクトリの階層構造をツリー表示したい http://oshiete.goo.ne.jp/qa/1381950.html
- 帰呼び出しを使うアルゴリズムとして超有名な「ハノイの塔」を詳細に解説します。 http://www13.plala.or.jp/kymats/study/C++/Hanoi/Hanoi.html
- gnuplotでフラクタル図形を描こう(再帰呼び出しと言えば, フラクタル図形) http://itchyny.hatenablog.com/entry/20130211/1360555378

さらに追加; (2015-07-05)
再帰に限定されているわけではありませんが、次の本は参考になるとおもいます。
書籍中に出てくるプログラムコードには 再帰をつかっているものが数多くあります。
- その数式、プログラムできますか? http://www.amazon.co.jp/gp/product/B00XX9K62W

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-5

再帰関数、再帰手順は、
1.コンピュータ資源の全てが貧しかった時代に、解決手段の一つとして、使われた手法です。
現在では、再帰で解決した方が良い場合のみ、適用します。
2.スタックをプログラム側から、意識して使用しない、
または、プログラム側から、制御するすべすらない、
現在の、コンパイラ環境等では、
スタックオーバーフローを起こしかねない手法です。
3.マルチコアなCPUが当たり前で、GPU演算が可能な現在では、
再帰よりは、並列化を可能とする手法を、学習した方が、良いかもしれません。

だからといって、再帰を否定するわけではありません。
再帰を使用することによって、効率があがり、安全で、美しいプログラムがかけるのであれば、
採用すればよいだけです。

検索ワード:再帰関数とは
など、「とは」検索は、手掛かりが無い場合、概念を掴みたい場合に、
役に立つこともあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/04 01:12

    > 1.コンピュータ資源の全てが貧しかった時代に、解決手段の一つとして、使われた手法です。
    これは違うでしょう。
    サブルーチン呼び出しのオーバーヘッドがあるので、再帰で綺麗に書けるときでもなんとか再帰を使わずに書けないかと考えてたと思います。末尾再帰はコンパイラがループに展開したり。再帰って、富豪プログラミングの一種だと思います。
    > 再帰で解決した方が良い場合のみ、適用します。
    これは昔からそうですね。

    キャンセル

  • 2015/07/04 02:21

    >末尾再帰はコンパイラがループに展開したり。
    >再帰って、富豪プログラミングの一種だと思います。
    コンパイラの最適化としての末尾再帰と、
    プログラムの手段としての、再帰関数、再帰手順を
    一緒にしていませんか?
    末尾再帰でループ構造に変換できるのは、元々ループ構造が取れ得るからです、
    再帰の使いどころは、ループ構造がとれない場合にあると、思っています。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    8490questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Ruby

    7894questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Python 3.x

    6831questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Perl

    460questions

    Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

閲覧数の多いPythonの質問