Python再帰の多様な書き方


テーマの背景:
いくつかの例を見てみましょう.1つの数値リスト(または他のシーケンス)を合計するには、内蔵sum関数を使用するか、よりカスタマイズされたバージョンを自分で作成できます.ここでは、再帰的に作成されたカスタム和関数の例です.
def mysum(L):
	if not L:
		return 0
	else:
		return L[0] + mysum(L[1:])

これは最も基本的な再帰的な書き方で、リスト内のすべてを再帰的に加算し、典型的なアヒルのタイプです.
コーディングの代替方法:
興味深いことに、Pythonの3元if/else式も使用できます.また、任意の加算可能なタイプについて一般化することもでき(少なくとも入力の1つを仮定すると、18章の最小最大値の例で行ったように、これは容易になり、Python 3.0の拡張シーケンスを使用して、最初の/他のパケットをより簡単にすることができます.
def mysum(L):
	return 0 if not L else L[0] + mysum(L[1:]) #        

def mysum(L):
	return L[0] if len(L) == 1 else L[0] + mysum(L[1:]) #        ,     []

def musum(L):
	first, *rest = L
	return first if not rest else first + mysum(rest)	

後者は、文字列が文字列のシーケンスであるため、単一の文字列パラメータ(例えばmysum(‘spam’))でも有効である.3つ目のバリエーションは、開いている入力ファイルを含む任意の反復可能なオブジェクトで有効ですが、インデックスのため、他の2つは有効ではありません.さらに、関数ヘッダdef mysum(first,rest)は、第3の変形と類似しているが、単一の反復可能なオブジェクトではなく、単一のパラメータを期待するため、まったく動作しない.
非線形構造の処理方法
ネストされたワードリスト構造内のすべての数値の合計を計算します.
[1,[2,[3,4],5,6,[[7,8,[9]]]

解:単純なループ文は、線形反復ではないため、ここでは機能しません.サブリストが任意の深さにネストされ、任意の形式でネストされる可能性があるため、ネストされたループ文も十分ではありません.逆に、次のコードは、サブリストに順次アクセスするために、このような一般的なネストに再帰的に対応するために使用される.
def sumtree(L):
	tot = 0
	for x in L:
		if not isinstance(x, list):
			tot += x
		else:
			tot += sumtree(x)
	return tot
"""
print(sumtree(L))
[1, 2, [3, 4], 5, [6, 7, [8, 9]]]
[3, 4]
[6, 7, [8, 9]]
[8, 9]
45

"""