0

私の教授は以下の機能を投稿しました。私はそれがどのように機能しているかを完全には理解していません。誰かがそれを説明できますか?

def rev(a):
    if a == []:
        return []
    else:
        return rev(a[1:]) + [a[0]]
4

2 に答える 2

2

これが行うことは、リストを再帰的に逆にすることです。それがどのように機能するかを確認する最も簡単な方法は、実行を追跡することです。

この関数は文字列を受け取り、最初の項目()を除くすべての逆バージョンを返し、a[1:]最初の項目を最後に追加して解決します。

Pythonは再帰用に最適化されていないため、これは実際の状況でこれを行うには悪い方法であることに注意してください(あなたの教授は再帰のアイデアを示しているだけだと思います)。代わりにreversed()組み込みのを使用してください。

また、それは特にPythonicコードではありません。効率的で、効果的で、十分にテストされた、使いやすいビルトインを使用する代わりに、再帰的なソリューションが必要な場合は、次のことを検討してください。

def rev(seq):
    return rev(seq[1:]) + [seq[0]] if seq else []
  • 三項演算子を使用して、を凝縮しif/elseます。
  • に置き換えるaseq、関数がより明確になります-Pythonには厳密な型指定がないため、関数が取るもの(この場合はシーケンス)の手がかりとなる名前を使用すると、より明確になります。
  • a == []をチェックするだけで置き換えられますseq。リストは空の場合に評価されるFalseため、空のリストと比較する必要はありません。
于 2013-01-31T21:27:09.923 に答える
2

aはリストです。aが空のリストの場合、空のリストを返します。そうでない場合は、「reverse」関数をリストに適用しますが、最初の要素を適用し、最初の要素を追加します。このようにして、reverseを再帰的に呼び出すたびに、右端の要素から始めて、reversedリストを作成します。

これは例です:

l=[1,4,6,7]

rev(l) returns rev([4,6,7])+[1]
rev([4,6,7]) returns rev([6,7])+[4]
...

そして最後に、rev([])が空のリストを返し、再帰呼び出しを終了します。

ところで、リストを逆にするにはl

l[::-1]
于 2013-01-31T21:30:40.513 に答える