#python #recursion
#python #рекурсия
Вопрос:
Пробуя некоторые вопросы, основанные на рекурсии, наткнулся на эту ошибку.
‘i’ — это количество цифр, которое увеличивается на 1. Где я ошибся?
определите нет. цифр при повторении div на 10
i = 0
def dig(n):
if n < 10:
i = 1
return
else:
i = 1
dig(n//10)
print(i)
dig(123)
Ответ №1:
В вашем коде есть несколько проблем. Вы определяете i
вне своей функции, но используете ее только внутри функции, что вызывает основную проблему. Однако в вашей функции также есть несколько логических ошибок.
Похоже, вы собирались:
def dig(n):
if n < 10:
return 1
else:
return 1 dig(n//10)
print(dig(123))
Но если вы действительно хотите использовать глобальную переменную для «подсчета» цифр:
digits = 0
def dig(n):
global digits
digits = 1
if n > 10:
dig(n//10)
return digits
print(dig(123))
Обратите внимание, что проблема в том, что она работает только один раз. Если вы вызовете ее снова, сначала вам придется выполнить сброс digits
до 0
снова. Это не лучший способ, и избегать глобальных значений, как правило, хорошая идея.
Если вам нужно, чтобы ваша функция включала вызов print()
вместо печати результата, вы можете изменить первое решение следующим образом:
def dig(n, c=1):
if n < 10:
print(c)
else:
dig(n//10, c 1)
dig(123)
Но, как правило, более полезно иметь функцию, которая возвращает результат, поэтому ее можно использовать в других местах, вместо того, чтобы просто печатать результат один раз.
Вы указали, что вам нужно сохранить счетчик в переменной, что имеет мало смысла, если вас также попросили написать рекурсивную функцию. Без рекурсии это выглядело бы больше как:
def dig(n):
digits = 1
while n > 10:
n = n // 10
digits = 1
return digits
print(dig(123))
Комментарии:
1. В вопросе упоминалось о сохранении количества цифр в переменной и ее увеличении.
2. также я забыл напечатать i после вызова
dig()
, вместо этого печатая i для каждого цикла: P
Ответ №2:
Вот правильная рекурсивная функция:
def dig(n, i = 0):
#base case
if n < 10:
return i 1
#recursion
return dig(n//10, i 1)
print(dig(123))
#output: 3