• ベストアンサー

再帰処理の考え方について詳くかかれたサイトありますか?

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

noname#102343
noname#102343

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★追記。 ・C言語ですが分かりやすそうなサイトを発見しましたので紹介します。  http://itpro.nikkeibp.co.jp/article/COLUMN/20061115/253812/→『第7回 再帰処理と参照渡し(モドキ)のメリット・デメリット』  http://www.geocities.jp/ky_webid/c/056.html→『C言語編 第56章 再帰呼び出し』  http://www1.cts.ne.jp/~clab/Contents/Recindex.html→『言語講座:関数の再帰呼出し』  http://www4.plala.or.jp/tamo/algo/09recursive.pdf→『データ構造・アルゴリズム No.09 再帰』 ・以上。参考にして下さい。

その他の回答 (2)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス >「再帰」についての概念のかかれたサイトは高度な内容ばかりで…  ↑  そんなに高度ですか?  多分は『再帰処理』の概念がもてないだけでしょう。  あるいはサンプルばかりで実用的な再帰処理を記述したことがないか。 >「再帰」について、噛み砕いた説明のあるサイトをご存知の方はおられますでしょうか?  ↑  『c 再帰処理』キーワードでネット検索したら直ぐに下のサイトが見つかりました。  http://homepage2.nifty.com/sak/w_sak3/doc/syspc/c_k09.htm→『再帰呼び出し処理 - ディレクトリ検索』  お探しの再帰処理でのディレクトリ検索です。  ただし、ちょっと分かりづらい気がしますね。 >再帰処理でフォルダ内のファイルを全検索するプログラミングを作成するために、色々と調査をしております。  ↑  私なら次のように全ファイルの検索を行います。  やっぱり再帰処理ですけど。 サンプル: // カレント・ディレクトリの再帰検索 VOID findListSubdir( LPTSTR lpPath ) {  WIN32_FIND_DATA fdFile;  HANDLE hFind;  LPTSTR lpWild;    lpWild = PathAddBackslash( lpPath );  lstrcpy( lpWild, TEXT("*.*") );    if ( (hFind = FindFirstFile(lpPath,&fdFile)) != INVALID_HANDLE_VALUE ){   do {    if ( fdFile.cFileName[0] != '.' ){     if ( fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ){      lstrcpy( lpWild, fdFile.cFileName );      findListSubdir( lpPath ); // 再帰呼び出し      /*      fdFile.cFileNameにフォルダ名      lpPathにフォルダのフルパス名      */     }     else{      lstrcpy( lpWild, fdFile.cFileName );      /*      fdFile.cFileNameにファイル名      lpPathにファイルのフルパス名      */     }    }   } while ( FindNextFile(hFind,&fdFile) );      FindClose( hFind );  }  lpWild[ -1 ] = '\0'; } 使い方: int main( void ) {  TCHAR szPath[ MAX_PATH ] = TEXT("C:\\");    findListSubdir( szPath )  return 0; } その他: ・上記のサンプルでは C:\ の配下のディレクトリをすべて検索しています。  表示は printf 文などがないので検索のみです。  必要に応じて printf 文を記述すれば全ファイルを検索表示されます。  記述場所はコメントの部分で『fdFile.cFileName』か『lpPath』を表示するようにします。 ・以上。

noname#102343
質問者

お礼

Oh-Orange様> ご回答が遅くなり、大変申し訳ございませんでした。 事例もありがとうございました! 中々、イメージが掴めなくて、色々なURL読んで漸く、どういうことか解ってきました。 本当に助かりました。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

再帰で単純というならこれかな? http://www.ic-net.or.jp/home/takaken/pz/pz2/page23.html ただし、サブディレクトリに再帰を使うのは良いですが、ファイル自体を再帰で処理するのはお勧めできません。すごく処理効率が悪いですよ。 単なるwhileループで処理できると思いますけど。

noname#102343
質問者

お礼

zwi様> ご回答ありがとうございました! お礼が遅くなってしまって申し訳ございません。 サブフォルダだけ…等々の意味が、お教えいただいたサイト等を読んで、ようやく解ってきました。

関連するQ&A

  • PHP初心者 再帰処理について

    あるフォルダ以下に含まれる全てのフォルダ名をフルパスですべて列挙するという処理を描こうと下記のブログを参考にして自分で少し書き換えたのですが、うまくいきません。 http://blog.asial.co.jp/12 <参考にした部分> function getFileList($dir) { $files = scandir($dir); $files = array_filter($files, function ($file) { // 注(1) return !in_array($file, array('.', '..')); }); $list = array(); foreach ($files as $file) { $fullpath = rtrim($dir, '/') . '/' . $file; // 注(2) if (is_file($fullpath)) { $list[] = $fullpath; } if (is_dir($fullpath)) { $list = array_merge($list, getFileList($fullpath)); } } return $list; } </参考にした部分> <自分で変更したコード> function getFileList($dir) { $files = scandir($dir); $files = array_filter($files, function ($file) { // 注(1) return !in_array($file, array('.', '..')); }); $list = array(); foreach ($files as $file) { $fullpath = rtrim($dir, '/') . '/' . $file; if (is_dir($fullpath)) { $list[] = $fullpath; $list[] = array_merge($list, getFileList($fullpath)); } } return $list; } </自分で変更したコード> 変更といってもis_fileの部分の削除と$list[] = $fullpath;を追加しただけなのですが、「~ bytes exhausted」というエラーになってしまいます。 再帰関数が内部的にどういう処理をしているのかよくわかってないので、正直変更したコードがどういう動きをしているのかいまいち理解できません。参考書にある再帰関数は腑に落ちないながらも結果としてはそうなるということは理解しました。 あとそれ以前に $files = array_filter($files, function ($file) {   return !in_array($file, array('.', '..')); の部分がわかりません。 scandirの戻り値には要素の最初の方に「.」と「..」が付くのでそれを削除する目的だとブログにはありますが、in_arrayはただ第一引数のものを第二引数から検索するだけのはずなのに、$filesの中身をarray_filtersの処理後に確認してみるとちゃんと「.」と「..」が削除されていて不思議です。あとin_arrayは第一引数のものを第二引数の中から検索するという関数だと思いますが、なぜそれをわざわざ反転させて((array('.', '..'), $file);じゃなく($file, array('.', '..'));)!in_arrayとしてるんでしょうか? *ちなみに引用したブログのコードの動作は確認済みで元のコードは完全に正しいです。引用したコードに文句をつけているわけではなく自分がわかっていないだけです。(^^ゞ 以上です。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 各種プログラミング言語のコードを検索できるサイト

    どこかで、各種プログラミング言語のコードを検索できるサイトが紹介されていたのをメモしたつもりでしたが見つかりません。 どなたかサイトを教えてください。

    • ベストアンサー
    • Java
  • プログラムの作り方

    みなさんは目的のプログラムを作り上げるために、どういった手順を踏みますか? それと、目的の達成率というのはどのくらいですか? 自分の技量によって到達点を変更しますか?または作り上げますか? 私は ・目的に合ったプログラミング言語を探す。 ・その言語の入門書を読む。 ・目的に近い内容のプログラミング解説書を読む。 ・それでも足りない部分は、自己流でなんとかする。 という手順を踏んでます。 でも、思い通りの形に作れないことが多いです(涙 または、道のりが遠すぎて挫折します。

  • Visual C++ 2005 Express Edition

    あるC言語をつかったウィンドウズプログラミングの本に載っていたコードを入力してビルドしようとしたら色々とエラーが出てしまい、今度はその本に付属していたCD-ROMに収録されていたコードを使ってビルドしても失敗してしまいました。 そして、その本を書いてらっしゃる方が管理をしているホームページにVC2005になってデータ型のチェックが厳しくなったと書いてありました。 そのサイトには新しくVC2005のサンプルプログラムが紹介されていたのですが、本に載っていたものとは少し違うようです。しかし、それを使ったら難なくビルドも出来て、ちゃんとウィンドウが表示されました。 ということは、今までに出版された本に載っているウィンドウズプログラミングのコードはVisual C++ 2005 Express Edition では使えないということなんでしょうか。 もし知っていらっしゃる方がいましたら、教えてください。よろしくお願いします。

  • 目的に適しているプログラミング言語等を教えて下さい。

    目的に適しているプログラミング言語等を教えて下さい。 メイン言語「Visual Basic 6.0」、データベース「Microsoft ACCESS 2000」で作成された生徒管理及びレッスン自動予約システムがあり、現在はネットワークHDDに置いて運用しています。 目的はこれをウェブ上(レンタルサーバやクラウド)に置き、同じように運用することは可能か否か?またウェブ上で運用するとなると現在のACCSESSだと不可&全く新しく作り直すことになるだろうと思いますが、目的に適ったプログラミング言語や必要な知識、概念などはなんなのか?検索しても完全に「?」ですので質問させて頂きました。 現在プログラミングの知識は乏しい(html,CSS)ですが、必要であれば身につけようと考えています。 よろしくお願いします。

  • プログラミングを学びたい。

    プログラミングについて学びたいと考えているのですが、 私は具体的にどういった事をすればよいのでしょうか。 自身でも色々と調べているつもりですが、この手の事については無知で、 どこから手を付けてよいやら、という様な右も左も分からない状態です。 質問1 . プログラミングの基本というか、流れと言えばいいか、 プログラミングの概念的なものを理解する為にはどうすれば良いんでしょう。 質問2 . 簡単なソフトウェアやゲームを作れるようなレベルに至るまでに 苦労する事とはどういった物が挙げられるんでしょうか。 質問3 . 言語というものがいくつかあるらしいのですが、 初めにどれを学ぶ事が望ましいのでしょうか。 質問4 . 私のような無知者向けの役に立つサイトや書籍を教えて下さい。 (可能ならあまり本には頼らずサイトから知識を得たいのですが…) 全くの素人なのでおかしな質問もあるかもしれません。 又、すべてにお答えいただかなくても構いません、 何かヒントの様なものでもいただけないでしょうか、よろしくお願い致します。

  • ソートの順番を変える処理

    現在、C言語の勉強をしています。 そこで、ソートについて皆さんのお知恵を拝借させてください。 文字コードで大小を比較してソートを行うにあたり、文字コードの大小とは違う方法でソートしたい場合はどのように行えば良いでしょうか? 例えばASCIIコードで 「*」は42(0x2a)、 「#」は35(0x23)、 数字の「0」は48(0x30)なので、 1:*111 2:#222 3:333 というデータがあった場合、文字コード順だと 1:#222 2:*111 3:333 という順になってしまいます。 それを 1:*111 2:#222 3:333 という順にソートするにはどうしたら良いのでしょうか? 実装方法が全く分からず、同じような質問が無いか探してみたんですが、見当たらなくて困っています・・・。 有識者の方、どうかよろしくお願いいたします。 また、以上のデータはASCIIですが、他にもSJISの文字(ひらがなや全角英数)を使用するデータのソートも同様の処理を行いたいと思っております。もし可能でしたら、少しだけでもアドバイスをお願いいたします。

  • 定義済み関数を用途別に逆引きしたい

    ボクはプログラミングに関してほぼ初心者で、 プログラミングの基礎はC言語だと聞いたので、C言語の入門本に取り掛かり変数や構造体や関数などの概念を学んだ上で、既存のウィンドウズ付属の定義済み関数を組み合わせてプログラミングしてみようと思ったのですが、一つの疑問が浮かび上がりました。 「定義済み関数を使うには、その関数を知っていることが前提条件なのか?それらは用途や目的など何らかの形で分類されていなくて、ただ漠然と並べられているのか?ボクはいくつ関数を覚えればいいんだ…?orz」という疑問です。 質問する前にボクなりに調べましたが、もしかしてこの「関数を用途や目的等別で分類する」とはオブジェクト指向の「クラス」にあたるのでしょうか?だとすれば、次にボクはオブジェクト指向のプログラミングを学ぶべきでしょうか?

  • C#によるWPF その3

    ExpressionBlendとVCを使ってWPFアプリケーションの開発を行っています.言語はC#です. 現在, MouseLeftButtonDown ⇒ MouseLeftButtonUp の順でRectangleを描画することは出来るのですが, 現状ではMouseLeftButtonUpのイベントが終了するまで描画結果が表示されません. 目標として, MouseLeftButtonDown後した座標を原点としたRectangleを MouseLeftButtonUpのイベントが起こるまで描画し続けたいのですが何か良い方法は無いでしょうか??(ラバーバンド??) やり方が悪かったのか, MouseMoveの間,描画し続ける方法も上手くいきませんでした. 目標さえ達成できれば,方法にはこだわりません. ヒントになるようなアドバイスを頂けないでしょうか?? 知恵を貸して下さい. 宜しくお願いします!!

  • プログラミング初級者が中級レベルになるにはどういう学習をすればいいです

    プログラミング初級者が中級レベルになるにはどういう学習をすればいいですか? いまmacでobjective シーを、mac付属のXcodeというソフトで学んでます 基本的な文法書は読み終わり、これから何か作りたいとは思うんですがなかなか応用ができません ソースコードを公開してるところがあればと探したんですが、日本語サイトはおそらくなし(アフィリエイトサイトばかりでした) 海外のではありましたが、ファイル数が多くてよくわからず、どうしたらいいやらと頭を抱えるばかり 個人的にはマックにはあC#でいうところの.frameworkの、CocoaがあるのでGUIは作れるとは思ってます メモ帳かデジタル時計などを作りたいんですが、ちょっとしたヒントとかないとできないほど初心者です プログラミング経験はまずC言語を始めて、基本情報処理技術者用に簡単なアルゴリズムを学んだくらいで、どの言語でも 本格的なプログラミング経験はありません よろしくお願いします

専門家に質問してみよう