• ベストアンサー

再帰について

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

  • mk1234
  • お礼率94% (1832/1940)

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

  • ベストアンサー
  • 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

  • 再帰構造のアルゴリズムで困っています。

    最近プログラミングを勉強し始めた者です。 教科書とWebを使って勉強しているのですが、なかなか厳しいです。 初歩的な質問であると思いますがお許しください。 フィボナッチ数列の8番目の数字を再帰構造を用いて表示させるプログラムを作りました。 Sub saikikouzou() n = 8 Cells(1, 1) = keisan(n) End Sub Function keisan(n) If n < 3 Then keisan = 1 Else keisan = keisan(n - 1) + keisan(n - 2) End If End Function 一般的にフィボナッチ数列と言われると「1.1.2.3.5.8.13.21」という数列であると理解しています。上記のプログラムもそのつもりで作成しました。 しかし今は「1.2.3.5.8.13.21.34」という数列の8番目を再帰構造を使って求めたいと考えています。 つまり、最初の数字を「1,1…」と始まるのではなく「1.2…」と始めたいのです。 私のプログラムだと、 If n < 3 Then keisan = 1 の部分で最初の数字が「1.1」と決めているため、良くないことは理解できましたが、どうすれば「1.2…」と始められるかが分かりません。 まだこの単元を消化しきっていないため、質問内容もままならない点がありますが、ご理解できましたら是非回答をよろしくお願いします。

  • ディレクトリを再帰的に探索する正規表現

    javaファイルを引数に取るプログラムを全てのjavaファイルに対して走らせたいのですが、 あるディレクトリ内(サブディレクトリ内を含めて)のjavaファイルを指定するような正規表現の書き方がわかりません。 直下だけならjava (プログラム名) *.javaで大丈夫なのですが、再帰的にサブディレクトリもさがすにはどのように書けばいいのでしょうか

  • 再帰検索って?

    今、ファイル検索ソフトを探しているのですが、「フォルダの『再帰検索』が可能」と銘打ったものが良く見られます。 この『再帰検索』ていうのは、どのような機能のことをいうのでしょうか?これがある無しでは使い勝手が大幅に異なるものなのでしょうか? よろしくお願い致します。

  • PHPでの再帰を用いたツリー構造について

    PHPを勉強中の初心者です。PHPで、ツリー構造を再帰関数を用いて実装するプログラムを作成し、そのツリーを表示しようとているのですが、どうもよくわかりません。 このプログラムの挙動としては、以下でクリエイトしたTreeオブジェクトを、preorder(トップダウン、左側から)で出力させるもので、期待値は以下のとおりです。 (期待値) preorder: 1 2 4 5 3 6 7 (クリエイトされたオブジェクト) $myTree = new Tree(1, new Tree(2, new Tree(4), new Tree(5)), new Tree(3, new Tree(6), new Tree(7))); =========サンプルプログラム================================ #!/usr/bin/env php <?php class Tree { var $top; var $left; var $right;     #コンストラクタを定義はこれであっているでしょうか。 function Tree($top, $left, $right){ $this ->top = $top; $this ->left = $left; $this ->right= $right; }; function preorder( ){         #preorder() メソッドを実装方法がよくわかりません。 } } $myTree = new Tree(1, new Tree(2, new Tree(4), new Tree(5)), new Tree(3, new Tree(6), new Tree(7))); function printPreorder($tree) { echo "preorder:\n"; $tree->preorder(create_function('$v', 'echo "$v\n";')); } printPreorder($myTree); ?>

    • 締切済み
    • PHP
  • 再帰的処理について

    指定したURLのページのHTMLを取得しその中のリンクを再帰的に表示するプログラムを考えていますが再帰的な処理の部分がよく理解できません。教えて下さい。お願いします。

    • ベストアンサー
    • Perl
  • 再帰処理を途中で抜けるには

    OS:XP VB6.0 はじまして。 現在、ツリー構造のオブジェクトを検索し ある名前(文字列)が着たら再帰処理を抜けて オブジェクトを取得したいです。 しかし、処理が最後まで行ってしまい オブジェクトを取得する事ができません。 ご存知の方宜しくお願いします。

  • PythonVer3の再帰について

    現在、再帰について勉強しています。 関数のステートメントブロックの中に同じ関数を2か所使った場合の、処理される順番がよく解りません。 そこで、プログラムが表示されている状態で、Enterキーを押す毎に1行ずつ処理が進んで行き、今どの行が働いたかが分る様なソフト又は方法がないでしょうか。 よろしくお願いいたします。

  • 再帰アルゴリズム

    再帰アルゴリズムの練習のため問題に取り組んでいるのですが、問題集に解答がついておらずイマイチ理解できていないので教えていただけると助かります。 d個の毎インデックスで(0,0,...,0)から(n,n,...,n)まで反復させるアルゴリズムを反復アルゴリズムと再帰アルゴリズムの両方考えよ です。 (0,0,0,...,0) (1,0,0,...,0) (1,1,0,...,0) (1,1,.....,1) ... (n,n,.....,n) と表示を繰り返すプログラムでいいのかな、と思い反復の方は二十ループを用いてプログラムかけたんですが、再帰の法がアルゴリズムがどうも理解できていません。 ご教授願えればと思い、お願いします。

  • 再帰でファイルハンドルの扱い方

    再帰でフォルダーからテキストファイルなど 読み出せるファイル群を全検索して目的の 文字列を表示させています 子供側がclosedirするので 親にファイルハンドルが無いよと 怒られます、何か良いアイデアありませんか __________________________________________ sub dirs_1($){ my( $an ) = @_; my( $cd,$file ); opendir K,"$an" or print "$an => $!\n\n"; for $file( readdir(K) ){ $cd = "$an/$file"; next if fu_1( $cd ) or re_1( $cd ); ( -d $cd ) ? dirs_1( $cd ) : op_1( $cd ); } closedir K; } __________________________________________ #fu_1()re_1()で画像やバイナリなどを弾く #dirs_1()で再帰、op_1()で文字列検索 よろしくお願いします

    • ベストアンサー
    • Perl
  • 再帰処理の考え方について詳くかかれたサイトありますか?

    再帰処理でフォルダ内のファイルを全検索するプログラミングを作成するために、色々と調査をしております。 (言語はVC++です) しかし、「再帰」についての概念のかかれたサイトは高度な内容ばかりで、どのように再帰のコードを作ったら目的が達成できるのか、予想がつきません。 「再帰」について、噛み砕いた説明のあるサイトをご存知の方はおられますでしょうか? ヒントだけでかまいません、お知恵を拝借、どうかよろしくお願い申し上げます。

専門家に質問してみよう