首先,针对您的特定问题的单线解决方案:
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
您还可以将 map 和 fold 步骤组合在一个函数中:
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
更多信息:map,fold,partial application。