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++で無理やりやろうとすると、こんな感じだろうか。
#includestruct {
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
}