Как работает функция reduce?

Насколько я понимаю, функция reduce берет список l и функцию f. Затем она вызывает функцию f на первых двух элементах списка, а затем повторно вызывает функцию f со следующим элементом списка и предыдущим результатом.

Итак, я определяю следующие функции:

Следующая функция вычисляет факториал.

def fact(n):
    if n == 0 or n == 1:
        return 1
    return fact(n-1) * n


def reduce_func(x,y):
    return fact(x) * fact(y)

lst = [1, 3, 1]
print reduce(reduce_func, lst)

Теперь, разве это не должно дать мне ((1! * 3!) * 1!) = 6? Но вместо этого он дает 720. Почему 720? Похоже, что он берет факториал 6 тоже. Но мне нужно понять, почему.

Может ли кто-нибудь объяснить, почему это происходит, и найти обходной путь?

В основном я хочу вычислить произведение факториалов всех записей в списке. Запасной план - запустить цикл и вычислить его. Но я бы предпочел использовать reduce.

40
задан Divya 2 February 2012 в 08:03
поделиться