Подсчет экземпляров определенного символа в строке с использованием рекурсии - PullRequest
0 голосов
/ 12 ноября 2019

Этот вопрос появился у меня на промежуточном этапе, и я понял, что я не все сделал правильно, поэтому я хотел бы знать, где я ошибся.

Я пытаюсь определить функцию count_char(string, char)который возвращает общее количество раз, когда char находится в приветствии с помощью рекурсии.


def count_char(string, char):
    #base case:
    if len(string) < 1:
        return
    #recursive case:
    if string[-1] == char:
        total = count_char(string[0:len(string)-1], char) + 1
    return total

Когда я запускаю count_char("hello", "h"), я получаю ошибку:

UnboundLocalError: local variable 'на total 'ссылаются перед присваиванием

Я не уверен, как еще я поступил бы так, чтобы total не был локальной переменной.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Как сказал Carcigenicate, проблема возникает из-за того, что условие if не гарантируется как истинное, а внутри if находится единственное место в функции, где total объявлено и определено.

Вот альтернативный способ сделать это:

def count_char(string, char):
    #base case:
    if len(string) is 0:
        return 0
    #recursive case:
    total = int(string[-1] == char) + count_char(string[:-1], char)
    return total

Кроме того, более логично возвращать int как из базового, так и из рекурсивного случая.

0 голосов
/ 12 ноября 2019

Как упоминалось в ошибке, если char нет в строке, то total еще не будет определено. Еще одна вещь, которую вы должны рассмотреть, это случай, когда строка пуста, и в этом случае вы хотите вернуть 0 так, чтобы она могла распространяться обратно в стек рекурсии.

Считайте этот исправленный код:

def count_char(string, char):
    #base case:
    if len(string) < 1:
        return 0
    #recursive case:
    if string[-1] == char:
        return count_char(string[0:len(string)-1], char) + 1
    return count_char(string[0:len(string)-1], char)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...