- PR -

再帰プロシージャ

投稿者投稿内容
あび
ベテラン
会議室デビュー日: 2004/07/29
投稿数: 59
投稿日時: 2004-07-30 15:51
引用:

Jittaさんの書き込み (2004-07-30 15:40) より:
 深さがわからない(パス文字列の最大長というストッパーはあるが)から、再帰は避ける、じゃないかなぁ。

 再帰処理だとローカル変数はすべてスタックして、新たな呼び出しようにメモリを確保しますよね。OOだとその辺のオーバーヘッドが結構かかるし、スタックオーバーフローという致命的例外も健在(はい、出しました)ですから。。。

 パスをキュー、またはスタックして、whileで回します。

こんな感じ
↓↓↓
キュー q = new キュー();
q.ためる(引数);
while (q.覗く() == true) {
 string p = q.取り出す();
 ディレクトリpの一覧を取る
 foreach f in pの一覧 {
  if (f == ディレクトリ) q.ためる(f);
  else {
   処理;
  }
 }
}



(再度)MSDNのヘルプにあった「再帰の代わりにループを使用できる場合もあります」
の回答ですね。ありがとうございます。
今回は、この方法で実装してみようと思います。

unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-07-30 17:41
unibon です。こんにちわ。

引用:

あびさんの書き込み (2004-07-30 15:51) より:
(再度)MSDNのヘルプにあった「再帰の代わりにループを使用できる場合もあります」
の回答ですね。ありがとうございます。


いわゆる、テールリカージョン(tail recursion)を最適化してループに置き換えることができる、ということですよね。
たしかにやったほうが良い、と思う反面、そこまで必要なんでしょうか、という疑問もあります。普通の実行環境では、スタックオーバーのエラーは、落ちるエラー、すなわち尾を引かない(良い)エラーなので、今回の目的がディレクトリの探索であることも考えると、オーバースペックのような気もします。
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-07-30 19:09
再帰の話でうっかりしていたけど
DirectoryInfo.GetFileSystemInfos メソッド は使えないんでしょうか?

_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2
あび
ベテラン
会議室デビュー日: 2004/07/29
投稿数: 59
投稿日時: 2004-08-02 08:31
引用:

えムナウさんの書き込み (2004-07-30 19:09) より:
再帰の話でうっかりしていたけど
DirectoryInfo.GetFileSystemInfos メソッド は使えないんでしょうか?





DirectoryInfo.GetFileSystemInfos も、直下のDirectoryとFileは取得できるのですが、下層をたどるには、同じような手法が必要なようです。

スキルアップ/キャリアアップ(JOB@IT)