7

「/」を区切り文字として再帰的に使用して、文字列として指定されたパスをサブパーツに分割し、タプルに渡そうとしています。例: "E:/John/2012/practice/question11" は ('E:', 'John', '2012', 'practice', 'question11') にする必要があります。

そのため、「/」を除くすべての文字をタプルに渡しましたが、例に示されているようにサブパーツのジョイントが必要な方法ではありません。これは宿題の練習問題であり、再帰を学ぼうとしているので助けていただければ幸いです。

どうもありがとうございます

4

2 に答える 2

11

このようなもの

>>> import os
>>> s = "E:/John/2012/practice/question11"
>>> os.path.split(s)
('E:/John/2012/practice', 'question11')

通知os.path.split()は、パス全体を分割しませstr.split()

>>> def rec_split(s):
...     rest, tail = os.path.split(s)
...     if rest == '':
...         return tail,
...     return rec_split(rest) + (tail,)
...
>>> rec_split(s)
('E:', 'John', '2012', 'practice', 'question11')

編集:質問はWindowsパスについてでしたが。「/」で始まるパスを含むunix/linuxパス用に変更するのは非常に簡単です。

>>> def rec_split(s):
...     rest, tail = os.path.split(s)
...     if rest in ('', os.path.sep):
...         return tail,
...     return rec_split(rest) + (tail,)
于 2012-11-22T04:36:35.847 に答える
1

エラーは再帰ではなく、再帰的な結果を連結するために行っていることです。に到達('E:', 'John', '2012', 'prac')したとします。次の文字は't'; です。再帰的な結果に追加するのではなく、再帰的な結果の最後の単語't'に追加したい。同様に、セパレーターに到達したら、新しい単語を空として初期化する必要があります。

再帰を行っているときは、(ほぼ) 常に 2 つのケースがあります: 再帰的なものと最終的なものです。ターミナル 1 は通常は簡単で、正しく実行できました (文字列がない場合、単語はありません)。しかし、再帰的なケースの特定の例を上記のように計算の途中で試してみると、何が起こる必要があるかを正確に理解するのに非常に役立ちます。

于 2012-11-22T04:19:57.410 に答える