- - PR -
再帰プロシージャ
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-07-30 13:35
「ルートのフォルダから、順次サブフォルダを検索していき、全てのファイルについてある処理をする」というのを、VB6で、再帰プロシージャを作成していました。
.NETでも、このプロシージャ自体は問題ないようなのですが、別な方法で実装できるでしょうか? | ||||
|
投稿日時: 2004-07-30 13:50
質問の意味がいまいち不明。VB6.0でも.NETでも再起処理は避けた方が良いでしょうし、VB6.0でも.NETでも再起を使わずにコードを書くことは可能。それとも別の方法と言うのはファイルの一覧を取得したりしない、もっと画期的な方法がないかと言う事なんだろうか?
| ||||
|
投稿日時: 2004-07-30 14:13
デザインパターンのCompositeパターンというのはどうでしょう。
考える上でのヒントになりませんか。 | ||||
|
投稿日時: 2004-07-30 14:22
再帰を避けた方が良い、というのは何故でしょうか? 今回のようなファイルツリー探索では、再帰を使うのが 最良だと思っているのですが…。 | ||||
|
投稿日時: 2004-07-30 15:25
ディレクトリツリーは深さはわかりませんので、 再帰は最適だと思いますが、、、 ほかになにかいい方法がありますでしょうか? _________________ | ||||
|
投稿日時: 2004-07-30 15:32
>再帰を避けた方が良い、というのは何故でしょうか?
一般に異常状態の回避にプログラマーの技量が問われるからです。 再帰に関する異常状態の回避はサンプルでも余り見たころは無いです。 しかし、DOM・ゲーム理論・OR等、再帰をしないとどうにもなら無いパターンもあります。 データをツリー状にしていって再帰をかけない方法もありますが、これもプログラマーの技量が問われます。 _________________ えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12 えムナウのプログラミングのページ Blog1 Blog2 | ||||
|
投稿日時: 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 { 処理; } } } | ||||
|
投稿日時: 2004-07-30 15:43
MSDNのヘルプ「再帰プロシージャ」に以下のような記述があったので、
この問題を回避できる方法(手法)があるかどうか、質問しました。 しかし、あくまでロジック(プログラマーの技量)上の問題になるということですね。 >変数に使用できるプログラムの領域は限られています。プロシージャが自分自身を呼び>出すたびに、変数によって使用される領域は増えていきます。このプロセスがいつまで>も続くと、最終的にはスタック領域のエラーが発生します。2 つのプロシージャがお互>いを呼び出し続ける場合や、再帰を制限する条件が満たされない場合には、原因がわか>りにくいことがあります。 >再帰プロシージャを使用する場合は、呼び出しが無限に続いたり、呼び出しが何度も続>いてメモリが使い尽くされたりすることがないかどうか、テストする必要があります。 Compositパターンについては、勉強してみます。 |