Как посчитать сколько раз вызывалась функция, не выходя за её рамки? Python
Всем доброго вечера. Есть такой код:
import math
n = 999
def cycle(a):
b = math.prod(list(map(lambda x: int(x), str(a))))
return b if len(str(b)) == 1 else cycle(b)
print(cycle(n))
Он разбивает двузначное (и больше) число на отдельные числа. И перемножает их пока результат не будет равен одному числу. Например, при n = 999 он выдаст 2. А внутри всё будет выглядеть так:
1) 9*9*9 = 729, 2) 7*2*9 = 126, 3) 1*2*6 = 12, 4) 1*2 = 2
То есть потребовалось 4 действия, чтобы получить результат с одним символом. Вопрос - как в самой функции вернуть это количество действий? Не выходя за её рамки. То есть кроме n = ... за пределами функции ничего быть не должно
А итоговый результат должен быть такой:
n = 999
def cycle(a):
.....
print(cycle(n))
>>>> 4
Или
n = 7
def cycle(a):
.....
print(cycle(n))
>>>> 0
Ответы (3 шт):
Вообще, вариантов масса:
C использованием декоратора
import math
n = 999
def counted(f):
def wrapped(*args, **kwargs):
wrapped.calls += 1
return f(*args, **kwargs)
wrapped.calls = 0
return wrapped
@counted
def cycle(a):
b = math.prod(list(map(lambda x: int(x), str(a))))
return cycle.calls if len(str(b)) == 1 else cycle(b)
print(cycle(n)) # 4
С использованием глобальной переменной
import math
n = 999
global counter
def cycle(a):
global counter
counter += 1
b = math.prod(list(map(lambda x: int(x), str(a))))
return counter if len(str(b)) == 1 else cycle(b)
counter = 0
print(cycle(n)) # 4
С использованием переменной у функции
import math
n = 999
def cycle(a):
cycle.counter += 1
b = math.prod(list(map(lambda x: int(x), str(a))))
return cycle.counter if len(str(b)) == 1 else cycle(b)
cycle.counter = 0
print(cycle(n)) # 4
Выбирайте какой нравится.
import math
n = 999
def cycle(a, step=1):
b = math.prod(list(map(lambda x: int(x), str(a))))
return (b, step) if len(str(b)) == 1 else cycle(b, step + 1)
print(cycle(n))
(2, 4) # первое число в кортеже - результат, второе - кол-во шагов
Чем проще, тем лучше. Рекурсия:
import math
def cycle(n):
if n < 10:
return 0
return cycle(math.prod(map(int, str(n)))) + 1
print(cycle(int(input())))
$ echo 999 | python cycle.py 4 $ echo 729 | python cycle.py 3 $ echo 126 | python cycle.py 2 $ echo 12 | python cycle.py 1 $ echo 2 | python cycle.py 0