reduce

Pythonにはreduceというのが関数があって面白い。


a = [ 1, 2, 3, 4 ]

def add(x, y): return x + y
sum = reduce(add, a)
print sum # 10

ラムダ(無名関数)を使ってもいいが、


sum = reduce(lambda x, y: x + y, a)

たぶん上のほうがわかりやすい。


reduce(add, [ 1, 2, 3, 4 ]) = add(add(add(1, 2), 3), 4) = 1 + 2 + 3 + 4 = 10

ということのようだ。
minだと、


a = [ 1, 2, 3, 4 ]

def min(x, y): return x if x < y else y
minimum = reduce(min, a)
print minimum # 1

こうすると階乗になる。


a = [ 1, 2, 3, 4 ]

def mul(x, y): return x * y
fac = reduce(mul, a)
print fac # 24

C++で無理やりやろうとすると、こんな感じだろうか。


#include

struct {
template
T operator()(S& f, const T *begin, const T *end) {
T result = *begin;
for(const T *p = begin + 1; p != end; ++p) {
result = f(result, *p);
}
return result;
}
} reduce;

int main() {
int a[] = { 1, 2, 3, 4 };
struct {
int operator()(const int& x, const int& y) { return x + y; }
} add;
int sum = reduce(add, a, a + 4);
std::cout << sum << std::endl; // 10

struct {
int operator()(const int& x, const int& y) { return x * y; }
} mul;
int fac = reduce(mul, a, a + 4);
std::cout << fac << std::endl; // 24
}