• ベストアンサー

再帰について

一般的(?)に、フォルダ内にあるファイルをサブフォルダまで含めて表示するとき、再帰という方法を用いると思います。 フォルダのようなツリー構造の場合に、再帰を使わなくても表示できるプログラムは作れるのでしょうか? (BASIC等は再帰が使えないと聞いたのですが・・・) 考え方だけで良いので、アドバイスお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.3

再帰的な処理を再帰を使わずに実装するのは可能でしょう。 ただ、素直に再帰を使った方が簡単で、シンプルなことがほとんどかと思います。 ファイル検索について、キューで書いて見ました (キューじゃなくてスタックでも同じ) 最初のディレクトリ名をキューに入れる キューが空になるまでループ {  キューから1つディレクトリ名を取り出す  そのディレクトリ内を検索 {   もしディレクトリならキューに入れる   ファイルなら表示するなど  } } キューやスタックをどう実装するかは、いろいろでしょう。 配列で楽しようとすれば、#2の方の「処理回数に制限」がつきます。

mk1234
質問者

お礼

回答ありがとうございました。

その他の回答 (3)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.4

No.2のymmasayanです。 >階乗計算に再帰を使う例が良く出てきますが、実際には再帰を使わなくても >プログラムは出来ます。 そのとおりです。再帰の例題にでてくるのは却って再帰の必要性に疑問を持たせる ものばかりです。再帰でなくても簡単に書けてしまうからです。 今回のファイル一覧表示もNo.3の方が示された形で簡単に出来てしまいます。 しかしBASICのようにキューもスタックもない言語では配列を使って 擬似的にキューかスタックを作らねば成らず、相当な苦労を伴います。 これらよりももっと複雑な(多変数を扱うような)ものではさらに大変に成るでしょう。どこまでを可能といい、どこからを不可能というか難しいところですね。 結局答えに成りませんでした。

mk1234
質問者

お礼

回答ありがとうございました。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

再帰処理を厳密に考えると可能な言語はかなり限られます。 特に古い言語やご指摘のBASICは再帰処理に対応していません。 GOSUB、RETURNを何重にもネストで書けば再帰処理と同じことは 出来ますがこれは再帰処理とは言いません。 再帰処理とは実行中のルーチンの途中からGOSUB(CALL)でそのルーチンの トップに飛び込みこれを何回でも繰り返せるものです。 再帰処理を使わずに同じようなことはできると書きましたが、実際のプログラムは 結構大変です。処理回数に制限がつくこともネックです。

mk1234
質問者

お礼

回答ありがとうございました。 質問は、再帰を用いずに再帰と同様の効果が得られるプログラムは書けるのか?ということですが、 貴殿の回答は、#1さんとは異なり、処理回数に制限がつく等で出来ないとう事ですね。

mk1234
質問者

補足

改めて、質問を整理しますと、 例えば、階乗計算に再帰を使う例が良く出てきますが、実際には再帰を使わなくてもプログラムは出来ます。 それと同じように、サブフォルダがいくつあるか分からないのに、再帰を用いずサブフォルダまで含め、ファイル一覧を表示するプログラムは出来るのでしょうか? お願いいたします。

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

BASIC(VBを含まない)で再起処理出来ないという訳ではないと思います。 gosubやreturnを使えば良いわけですから。 但し、C言語の様にローカル変数やグローバル変数という概念が無く、すべてグローバル変数の様に扱われるからだと思います。 再起を使わないでやる場合は、上位ディレクトリに戻る際に、再度ディレクトリの中を検索くして、次のディレクトリを探して移動といった事を行わなくてはなりませんので、かなり処理に無駄がありますね。 それ以外だとすれば、配列に入れておくという事も出来ますが、1次元配列しか作れなかったと思いますので、親ディレクトリのすべてのファイルやディレクトリを保持しておくのは難しいですね。 とは言ってもCで再起で書いても _dos_findfirstや_dos_findnextが再起で正常に動作するかは不明ですね。 正常に動作させるには、カレントディレクトリのファイルやディレクトリを配列に保存しておかなくてはなりません。

mk1234
質問者

お礼

回答ありがとうございました。 難点はあるものの、技術的には可能と捕らえてよいのですね。

関連するQ&A

専門家に質問してみよう