Как продолжить работать с результатом рекурсивной функции?

Прошу прощения за невнятное описание проблемы. В общем есть всем известная рекурсивная функция вычисления факториала числа:

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

Подскажите, пожалуйста, как использовать её результат, чтобы вычислить кол-во нулей на конце получившегося числа. У меня вся проблема в том, что я не знаю чему присвоить результат этой функции. В переменную никак не получается, т.е. строка вида x = zeros(n) понятное дело, вне функции уже не работает. Т.е. мне по-хорошему нужна наверное функция в функции. Можно ли сделать какой-то декоратор?

Заранее большое спасибо!


Ответы (2 шт):

Автор решения: strawdog

Не понятно, что у вас не работает, разве что с индентацией проблемы:

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

res = zeros(4)
print(res)

24

→ Ссылка
Автор решения: EzikBro

Вероятно, это можно сделать через какой-то там декоратор или еще какую-то страшную штуку, но лучше всего написать отдельную функцию, считающую нули на конце числа.

def factorial(n):
    if n <= 1:
        return 1
    return factorial(n - 1) * n

def zeros(n):
    res = 0
    while n % 10 == 0:
        n //= 10
        res += 1
    return res

#Или если вы обожаете рекурсию:

def recursion_zeros(n):
    if n % 10 != 0:
        return 0
    return 1 + recursion_zeros(n // 10)

#В любом случае основная функция:

def factorial_zeros(n):
    return zeros(factorial(n))

Но вообще вычисление факториала (тем более рекурсией) - это достаточно затратная по вычислениям операция, поэтому я бы советовал вам использовать более математический метод:

  1. Количество нулей - максимальная степень десяти, на которую делится число
  2. Если число делится на 10^n, то это тождественно, что оно делится одновременно на 2^n и на 5^n. Значит, максимальный n - это минимум из степеней двойки и пятерки в разложении числа.
  3. Чтобы найти степень простого в разложении факториала на множители есть специальный алгоритм, работающий за O(log(N)) для N!.
  4. Очевидно, что степень пяти в разложении факториала всегда меньше.

Тогда функция будет выглядеть примерно так:

def factorial_zeros(n):
    pow5 = 0
    while n > 0:
        n //= 5
        pow5 += n
    return pow5
→ Ссылка