現在、再帰的な方法として for ループを実装しています。
for i in range(len(list)):
**implementation code goes here**
これを再帰メソッドとして実装するにはどうすればよいですか?
リストを調べて、各項目が受け入れ可能な値の別のリストにあるかどうかを確認する予定です。もしそうなら、私はそれに対して特定の行動をとります。それ以外の場合は、他のアクションを実行します。
標準の構造再帰式 (および、Scheme のような関数型言語を使用している場合に使用する式) は、リストを再帰的に分解することです。
func([]) => nothing
func([x, ...]) => do_stuff(x), func([...])
したがって、これを行う「機能的な」方法は、(インデックスではなく) 単一のリストを取得し、より小さなリストで再帰することです。
def rec_list(l):
if not l: return # empty list case
# process l[0]
return rec_list(l[1:])
のせいで、これはひどく、ひどく非効率的であることに注意してくださいl[1:]
。
この種の構造的再帰で興味深いことができます。たとえば、関数型言語でリストを逆にする方法は次のとおりです。
def rev_list(l):
if not l: return []
return rev_list(l[1:]) + [l[0]]
(もちろん、l[::-1]
Python で実行することもできますが、ここでは再帰的に実行する方法を示そうとしています)。
それで、あなたは素晴らしい(ほとんど)うまくコード化されたループを廃止したいですか?(主に、代わりに使用したい場合が多いため)-かなりクールです。一度使用を開始すると、振り返ることはありません。enumerate
range(len(lst))
enumerate
とにかく、私たちはそれを行うことができると思います:
def silly_loop(lst,index=0):
try:
#do something with index and lst here
silly_loop(lst,index=index+1)
except IndexError: #or maybe a different error, depending on what you're doing with index ...
return
例:
def silly_loop(lst,index=0):
try:
print lst[index]
silly_loop(lst,index=index+1)
except IndexError:
return
a = range(10)
silly_loop(a)
実際のコードでこれを実行したい理由は考えられないことに注意してください(ただし、再帰について自分自身に教えるためにこれを実行している場合は、これが役立つことを願っています)。