3

特定のファイルを検索するためのコードを作成しました。ユーザーが開始パスとファイル名を入力すると、プログラムはファイルが存在する場合はその詳細を出力し、そうでない場合は出力しません。

私が推測したように、再帰を使用すると、階層ツリーが大きすぎるとコードがクラッシュします。400のディレクトリで試しましたが失敗したので、50フォルダのようなものの後に、再帰のオーバーヘッドが発生すると思います。コードをクラッシュさせます。

それを修正する方法の提案はありますか?基本的に、コードは低レベルのツリー階層では問題ありませんが、健全なツリー(500〜600個のフォルダーが相互にあり、最後のフォルダーに保存されているファイル)用に設計する必要があります。

4

2 に答える 2

3

最も汚い方法は、スタックサイズを増やすことです。

2つ目は、再帰呼び出しの後で置き換え char full_name[_POSIX_PATH_MAX + 1]char *fullname=malloc((_POSIX_PATH_MAX + 1)*sizeof(char))、忘れないようにすることです。free()

そしておそらく最良の方法は、そのコードを廃棄し、強力な遍在を使用することですfind

于 2012-06-17T07:18:03.727 に答える
3

ディレクトリを(すぐに処理するのではなく)表示されたとおりに保存し、後の反復でディレクトリに戻ることで、再帰を削除(つまり、反復ソリューションに変換)できます。ただし、正確に同じ出力が得られない場合があります(順序が異なる場合があります)。

この方法が機能する方法は、処理するディレクトリのリストを用意し、このリストを確認することです(子ディレクトリを追加します)。

擬似コード/Pythonの場合:

def print_dirs(path, recursive, filename):
   dir_stack = empty stack
   dir_stack.push(path)

   while dir_stack is not empty:
      dir = dir_stack.pop() # returns the head element (and removes it)

      for file in children(dir):

         # ...do stuff with names...

         if recursive and file is a directory:
             dir_stack.push(file) # process the directory later

スタックは、単一リンクリストとしてかなり簡単に実装できます。pathがディレクトリでない場合は特別な処理が必要であり、これ再帰的ではないことに注意してください。

于 2012-06-17T07:36:40.183 に答える