Как правильно сделать рекурсию?
Нашел задачку в которой нужно число разложить на составляющие числа и сплюсовать их, если в этом числе будет больше 1-го элемента сделать тоже самое. Но я не до конца понимаю как реализовать рекрсию, вроде написал, а оно не работает. Кто может объяснить вместо чего подставляется мой d_root в строке digital_root(d_root)?
def digital_root(n):
n = str(n)
d_root = 0
for num in n:
d_root += int(num)
if len(str(d_root)) > 1:
digital_root(d_root)
else:
return d_root
print(digital_root(29))
29 -> 11 -> 2 # 2 + 9 = 11 = 1 + 1 = 2
Ответы (1 шт):
Ошибка построения рекурсии в строке digital_root(d_root) - значение не возвращается.
Cледовало написать return digital_root(d_root), потому что при рекурсии происходит спуск цепочкой до самого начального значения, которое называется "базой рекурсии", а в случае если происходит обычный вызов функции, вместо возврата ее значения, то на самой вершине стека вызовов об итоговом результате работы никак узнают и возвратится None.
P.S Я бы переписал эту функцию чуть более просто:
def digital_root(n):
sum_digits = sum(map(int, str(n)))
if sum_digits > 9:
return digital_root(sum_digits)
return sum_digits
print(digital_root(29)) # 2
Либо в одну строку:
def digital_root(n):
return n if n < 10 else digital_root(sum(map(int, str(n))))
P.P.S А вообще, это очень известная задача, и для нее есть красивые математические решения без рекурсии, например:
def digital_root(n):
if n % 9 == 0 and n != 0:
return 9
return n % 9
И даже вот такое :)
def digital_root(n):
return 1 + (n - 1) % 9