初めてローカル変数というものを見た時は、便利な世の中になったものだと驚きました。更に、再帰処理というものを知った時はひっくり返りました。
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);
}
上記のように、自分自身のメソッドを呼び出す
自分大好きー
な処理を再帰処理と言います。
ちなみに、これを実行すると次のように出力ウィンドウに表示されます。
R
RR
RRR
RRRR
RRRRR
RRRR
RRR
RR
R
例えば、ディレクトリーのような階層を持つデータを処理する場合に便利です。
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