- PR -

再帰プロシージャ

投稿者投稿内容
あび
ベテラン
会議室デビュー日: 2004/07/29
投稿数: 59
投稿日時: 2004-07-30 13:35
「ルートのフォルダから、順次サブフォルダを検索していき、全てのファイルについてある処理をする」というのを、VB6で、再帰プロシージャを作成していました。
.NETでも、このプロシージャ自体は問題ないようなのですが、別な方法で実装できるでしょうか?

甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2004-07-30 13:50
質問の意味がいまいち不明。VB6.0でも.NETでも再起処理は避けた方が良いでしょうし、VB6.0でも.NETでも再起を使わずにコードを書くことは可能。それとも別の方法と言うのはファイルの一覧を取得したりしない、もっと画期的な方法がないかと言う事なんだろうか?
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-07-30 14:13
デザインパターンのCompositeパターンというのはどうでしょう。
考える上でのヒントになりませんか。
未記入
大ベテラン
会議室デビュー日: 2003/11/24
投稿数: 121
投稿日時: 2004-07-30 14:22
引用:

VB6.0でも.NETでも再起処理は避けた方が良いでしょう


再帰を避けた方が良い、というのは何故でしょうか?
今回のようなファイルツリー探索では、再帰を使うのが
最良だと思っているのですが…。
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 2004-07-30 15:25
引用:

甕星さんの書き込み (2004-07-30 13:50) より:
質問の意味がいまいち不明。VB6.0でも.NETでも再起処理は避けた方が良いでしょうし、VB6.0でも.NETでも再起を使わずにコードを書くことは可能。それとも別の方法と言うのはファイルの一覧を取得したりしない、もっと画期的な方法がないかと言う事なんだろうか?


ディレクトリツリーは深さはわかりませんので、
再帰は最適だと思いますが、、、
ほかになにかいい方法がありますでしょうか?

_________________
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-07-30 15:32
>再帰を避けた方が良い、というのは何故でしょうか?
一般に異常状態の回避にプログラマーの技量が問われるからです。
再帰に関する異常状態の回避はサンプルでも余り見たころは無いです。
しかし、DOM・ゲーム理論・OR等、再帰をしないとどうにもなら無いパターンもあります。
データをツリー状にしていって再帰をかけない方法もありますが、これもプログラマーの技量が問われます。

_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-30 15:40
引用:

CHNさんの書き込み (2004-07-30 15:25) より:

ディレクトリツリーは深さはわかりませんので、
再帰は最適だと思いますが、、、
ほかになにかいい方法がありますでしょうか?


 深さがわからない(パス文字列の最大長というストッパーはあるが)から、再帰は避ける、じゃないかなぁ。

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

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

こんな感じ
↓↓↓
キュー q = new キュー();
q.ためる(引数);
while (q.覗く() == true) {
 string p = q.取り出す();
 ディレクトリpの一覧を取る
 foreach f in pの一覧 {
  if (f == ディレクトリ) q.ためる(f);
  else {
   処理;
  }
 }
}
あび
ベテラン
会議室デビュー日: 2004/07/29
投稿数: 59
投稿日時: 2004-07-30 15:43
MSDNのヘルプ「再帰プロシージャ」に以下のような記述があったので、
この問題を回避できる方法(手法)があるかどうか、質問しました。
しかし、あくまでロジック(プログラマーの技量)上の問題になるということですね。

>変数に使用できるプログラムの領域は限られています。プロシージャが自分自身を呼び>出すたびに、変数によって使用される領域は増えていきます。このプロセスがいつまで>も続くと、最終的にはスタック領域のエラーが発生します。2 つのプロシージャがお互>いを呼び出し続ける場合や、再帰を制限する条件が満たされない場合には、原因がわか>りにくいことがあります。

>再帰プロシージャを使用する場合は、呼び出しが無限に続いたり、呼び出しが何度も続>いてメモリが使い尽くされたりすることがないかどうか、テストする必要があります。


Compositパターンについては、勉強してみます。

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