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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

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

Ruby

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

Python 3.x

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

Python

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

Q&A

3回答

4564閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Perl

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

Ruby

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

Python 3.x

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

Python

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

0グッド

2クリップ

投稿2015/07/03 15:34

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

再帰処理の基本は、

  1. 問題を、少し解きやすい問題の組み合わせで表現する。
  2. 一番解きやすい問題を実際に解く。

です。
階乗計算、フィボナッチ数、 ハノイの塔, フラクタル図形、 クイックソート、フォルダーの階層表示
といった問題を再帰でプログラミングするときに、このことを念頭においてみてください。

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

問題の分解:

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

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

解きやすい問題:

サブフォルダがなければ、
フォルダー名を表示する。
フォルダーにあるファイル名を表示する。
だけです。これは簡単にかけるはず。

参考:

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

投稿2015/07/03 22:26

編集2015/07/05 08:57
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2015/07/03 15:42

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/07/03 15:45

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

2015/07/03 16:14

再帰を理解するために数学的帰納法が必須というわけじゃ無いですが、数学的帰納法であれば、高校生向けのわかりやすいテキストがあるだろうということからのアドバイスです。 「数学的帰納法は十分使いこなせるが、再帰関数は理解できない」というのは考えにくいので。
guest

0

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

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

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

投稿2015/07/03 15:52

daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2015/07/03 16:12

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

2015/07/03 17:21

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問