あなたの問題が解決したら、テール再帰は一般的に有用な手法であるため、一般的にループとテール再帰の概念を説明します。
Python でのループとリスト内包表記は、末尾再帰が必要になる可能性が低いことを意味しますが、その考えを持っていることは良いことです。
関数を再帰的に呼び出す手法は、末尾再帰と呼ばれます。末尾再帰とループを使用して同じことを実現できますが、両方は必要ありません。
あなたが望むことをするために、ループを使うことができます:
def ifeveryitems(lst):
for items in lst:
if not isinstance(items,list) or len(items) > 2:
return False
return True
または末尾再帰:
def ifeveryitems(lst):
if isinstance(items,list) and len(lst)==0:
return True
return isinstance(lst[0],list) and len(lst[0]) <= 2 and ifeveryitems(lst[1:])
この関数は、 の最初の項目がlst
リストであり、長さが 2 以下であるかどうかをチェックlst[1:]
し、関数自体を使用してリスト ( ) の残りをチェックします。最終的には、ショートカットによって False を返す (isinstance(lst[0],list) and len(lst[0]) <= 2
が False の場合) か、リスト全体が使い尽くされて True を返す場合の基本ケースに到達します。
len(L)
もう 1 つの例:自分で実装する場合。常にリストである
と仮定すると、ループを使用して実装できます。L
len
def len(L):
i = 0
for item in L:
i += 1
return i
(注: このようなループを使用することは累積とも呼ばれます)
または末尾再帰。
def len(L):
if L==[]:
return 0
return 1 + len(l[1:])
リストの最初の項目を削除し、リストの残りの長さに 1 を追加します。最終的には、L が使い果たされて空のリストになるポイントに到達し、その場合は 0 を返すだけです。