Как сохранить значение переменной в рекурсии ( значение - это число). Python
Я решал задачку. В ней нужно найти мультипликативную постоянство, то есть количество раз, которое вы должны умножать цифры,пока не дойдете до единственной цифры.На пример, дано число 39. 3*9 = 27. 2*7 = 14. Затем 1*4 = 4. И останавливаемся. Всего "шагов" 3.Причем, дается только 1 агрумент(number). Вот мой код:
from functools import reduce
# amount - total length of blocks
# 67 - number
# ['6','7']
def rec(number, *args):
summ = args
amount = 0
t1 = tuple(map(int, list(str(number))))
l1 = len(t1)
amount += l1
lst = list(summ)
lst.append(1)
if amount > 1:
result1 = reduce(lambda x, y: x * y, t1)
rec(result1, lst)
else:
return sum(list(args))
Ответы (2 шт):
Автор решения: Zhihar
→ Ссылка
А как вам такое решение в лоб для подсчета кол-ва шагов - грубо конечно (из-за использование строки):
def calc(value):
if value < 10:
return 0
res = 1
for i in str(value):
res *= int(i)
return 1 + calc(res)
print(calc(39))
Ну или если вам нравятся однострочные варианты:
import math
def calc(value):
return 0 if value < 10 else (1 + calc(math.prod(int(i) for i in str(value))))
Без строк можно делать так:
def calc(value):
if value < 10:
return 0
res = 1
while value > 0:
res *= value % 10
value //= 10
return 1 + calc(res)
Автор решения: SergFSM
→ Ссылка
Еще вариант без строк, с двойной рекурсией. Значение переменной сохраняется через позиционный аргумент (y в этом примере):
def rec(x, y=0):
f = lambda i: i if i<10 else f(i//10) * (i%10)
return y if x<10 else rec(f(x), y+1)
rec(39) # 3