まず、特定の問題に対するワンライナーソリューション:
def rec_add(s):
return s[0] * s[0] + rec_add(s[1:]) if s else 0
より高度で抽象的なものが続きます。
関数型プログラミングの専門用語では、x ** 2をリストに「マップ」し、その要素を一緒に追加してリストを「折りたたむ」。Pythonは、そのために必要なプリミティブ(map
およびreduce
それぞれ)を提供し、二乗和は次のように簡単に記述できます。
from operator import add, mul
xs = [1,2,3,5]
print reduce(add, map(mul, xs, xs)) # 39
マップとフォールドのステップを1つの関数に組み合わせることもできます。
def map_and_fold(xs, mapfun, foldfun, init):
if not xs:
return init
return foldfun(
mapfun(xs[0]),
map_and_fold(
xs[1:], mapfun, foldfun, init))
sum_squares
上記の部分適用として定義します。
from functools import partial
sum_squares = partial(map_and_fold,
mapfun = lambda x: x * x,
foldfun = lambda x, y: x + y,
init = 0)
テスト:
xs = [1,2,3,5]
print sum_squares(xs) # 39
詳細:マップ、フォールド、部分適用。