локальная переменная ‘i’, на которую ссылаются перед назначением

#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