Как продолжить работать с результатом рекурсивной функции?
Прошу прощения за невнятное описание проблемы. В общем есть всем известная рекурсивная функция вычисления факториала числа:
def zeros(n):
if n == 0 or n == 1:
return 1
return zeros(n-1)*n
Подскажите, пожалуйста, как использовать её результат, чтобы вычислить кол-во нулей на конце получившегося числа. У меня вся проблема в том, что я не знаю чему присвоить результат этой функции. В переменную никак не получается, т.е. строка вида x = zeros(n) понятное дело, вне функции уже не работает. Т.е. мне по-хорошему нужна наверное функция в функции. Можно ли сделать какой-то декоратор?
Заранее большое спасибо!
Ответы (2 шт):
Не понятно, что у вас не работает, разве что с индентацией проблемы:
def zeros(n):
if n == 0 or n == 1:
return 1
return zeros(n-1)*n
res = zeros(4)
print(res)
24
Вероятно, это можно сделать через какой-то там декоратор или еще какую-то страшную штуку, но лучше всего написать отдельную функцию, считающую нули на конце числа.
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))
Но вообще вычисление факториала (тем более рекурсией) - это достаточно затратная по вычислениям операция, поэтому я бы советовал вам использовать более математический метод:
- Количество нулей - максимальная степень десяти, на которую делится число
- Если число делится на
10^n, то это тождественно, что оно делится одновременно на2^nи на5^n. Значит, максимальныйn- это минимум из степеней двойки и пятерки в разложении числа. - Чтобы найти степень простого в разложении факториала на множители есть специальный алгоритм, работающий за
O(log(N))дляN!. - Очевидно, что степень пяти в разложении факториала всегда меньше.
Тогда функция будет выглядеть примерно так:
def factorial_zeros(n):
pow5 = 0
while n > 0:
n //= 5
pow5 += n
return pow5