R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

再帰処理

初めてローカル変数というものを見た時は、便利な世の中になったものだと驚きました。更に、再帰処理というものを知った時はひっくり返りました。


private int 深さ = 0;
private const int 折り返す深さ = 5;

public void 君() {
  this.();
}

private void () {
  ++this.深さ;
  this.深さ分Rを表示();
  if (this.深さ < 折り返す深さ) {
    this.(); // 俺が俺自身を呼び出す。さすが俺様。
  }
  --this.深さ;
  this.深さ分Rを表示();
}

private void 深さ分Rを表示() {
  string s = "";
  for (int i = 0; i < this.深さ; ++i) {
    s += "R";
  }
  System.Diagnostics.Debug.WriteLine(s);
}


上記のように、自分自身のメソッドを呼び出す

自分大好きー

な処理を再帰処理と言います。

ちなみに、これを実行すると次のように出力ウィンドウに表示されます。



RR
RRR
RRRR
RRRRR
RRRR
RRR
RR



例えば、ディレクトリーのような階層を持つデータを処理する場合に便利です。


private void あるフォルダ以下の中身を晒す(string フォルダ名) {
  string[] files = this.ファイル一覧を取得する(フォルダ名);
  for (int i = 0; i < files.Length; ++i) {
    this.晒す(files[i]);
    if (this.これはフォルダである(files[i])) {
      this.あるフォルダ以下の中身を晒す(フォルダ名 + @"\" + files[i]);
    }
  }
}


一方で、再帰的に処理をする場合は、スタックオーバーフローに注意しなければなりません。
例えば、再帰処理というとクイックソートが思い浮かびますが、要素数が大量にある場合、再帰呼び出しの限界を軽く超えてしまう可能性があります。

また、ロジック的にも無限ループ(実際はスタックオーバーフローでて異常終了)を招きやすいため、使用する場合には十分な注意が必要です。

そんな訳で、上記の「あるフォルダ以下~」を再帰を使わない場合のコードを書こうと思ったのですが、時間的な理由で辞めておきますw

投稿日時 : 2007年2月21日 18:46

Feedback

# re: 再起処理 2007/02/21 19:33 とっちゃん

とりあえず突っ込みをw
タイトルが、起ってますよw帰ってきてないっすww

ちなみに、無限再帰の結果で落ちるタイプ(一般にはスタックオーバーフローが発生する)は、何も言わずに消えることが大半です。<Nativeの場合

なので、そういう落ち方した場合は、まず最初にスタックオーバーフローを疑いますw
ま、大抵は再帰メッセージといういやーんなパターンが多いんですがねwww

# re: 再起処理 2007/02/21 20:46 渋木宏明(ひどり)

メモリの消費量→スタックの消費量

# re: 再起処理 2007/02/21 22:05 中博俊

ひどりさんの言う通りなんだけど、スタックがゆえにメモリがいくら潤沢にあっても落ちる時は落ちるという。

# re: 再帰処理 2007/02/21 23:23 R・田中一郎

とっちゃん
>タイトルが、起ってますよw帰ってきてないっすww

本当ですね。
以前、同じ間違いをしているページを見て「アイタタ!」と思っていたのに、まさか自分も間違えてしまうなんて orz

---------------------------------
渋木宏明(ひどり) さん

むむっ、訂正しておきまする。
いつも、ありがとうございます。

---------------------------------
中博俊 さん

そうですね。スタックオーバーフローの場合は、潤滑にシステムは動いてくれますもんね。
ところで、今日久しぶりに無限ループ作ってしまいました・・・

# compile-time recursive 2007/02/21 23:39 東方算程譚

compile-time recursive

# compile-time recursion 2007/02/22 0:56 東方算程譚

compile-time recursion

# re: 再帰処理 2007/02/22 9:57 中博俊

起きるといえば
次元波動超弦励起縮退半径跳躍重力波超光速航法
って一文字しかはいってねぇ

# re: 再帰処理 2007/02/22 10:43 かるあ

VB.NET でよくやったスタックオーバーフロー
2005 になってからは警告が出るようになったのでうれしい

Public ReadOnly Property Hoge As String
 Get
  Return Hoge
 End Get
End Property

# re: 再帰処理 2007/02/22 11:49 R・田中一郎

中博俊 さん

>次元波動超弦励起縮退半径跳躍重力波超光速航法

以下でざっと調べてみたのですが、ワープとの違いが良くわかりませんでした。
http://ja.wikipedia.org/wiki/%E8%B6%85%E5%85%89%E9%80%9F%E8%88%AA%E6%B3%95

-----------------------------------------------
かるあ

>2005 になってからは警告が出るようになったのでうれしい

僕も、プロパティで作っちゃう場合が一番多かったです。

# re: 再帰処理 2007/02/22 13:23 渋木宏明(ひどり)

ガード句ってわけじゃないけど、再帰の場合、メソッドの冒頭に脱出条件を書くな>じぶん

# re: 再帰処理 2007/02/23 0:53 黒龍

古いエントリだけどこれもかな?つhttp://blogs.wankuma.com/kokuryu/archive/2006/08/16/36462.aspx

# re: 再帰処理 2007/02/23 16:10 R・田中一郎

かるあ さん

敬称を付け忘れてしまって、ごめんなさいごめんなさいごめんなさい。

---------------------------------------------
渋木宏明(ひどり) さん

そうですね。
確かに、そういう書き方の方がわかりやすいですし、僕もそうすることの方が多いです。
・・・サンプル書いていて「何か違和感あるなー」と思ってたんですが、そうか、そういうことだったのか orz

---------------------------------------------
黒龍 さん

Converter 面白いですね。

# re: 再帰処理 2007/08/09 12:14

参考します。

# re: 再帰処理 2007/08/10 15:16 R・田中一郎

どうぞー

タイトル
名前
Url
コメント