2015-07-07 5 views
1

Я написал функцию python replace_str, которая потребляет 3 непустые строки, базу, цель и rep.Python Ошибка максимальной рекурсии глубины - проблема с базовым регистром

Первая строка, база представляет собой базовую строку, которую вы хотите обновить. Вторая строковая цель представляет собой целевую строку, которую вы хотите заменить, а третья строка представляет собой строку, которая заменит цель в обновленной строке.

Функция создает новую строку, в которой целевая строка заменяется на строку rep в базовой строке, но создает ту же базовую строку, если выполняется одно из следующих условий: true.

• Если целевая строка не найдена в базовой строке или

• Если цель и репутация являются одни и те же строки.

НЕ разрешается использовать строку методы замены и найти

Это то, что я до сих пор:

def replace_str(base, target, rep): 
    m = 0 
    n = len(target) 
    if base[m:n] == target: 
     new_base = base[0:m] + rep + base[n:] 
     return replace_str(new_base, target, rep) 
    else: 
     m = m + 1 
     n = n + 1 
     return replace_str(base, target, rep) 

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

replace_str("aaaax","aa","x") должен производить 'aax', но дает мне ошибку.

replace_str("aa", "aa", "x") однако дает мне правильный результат от 'x'.

Кроме того, этот пост не является дубликатом другого. Программа со связанным сообщением совершенно другая и имеет другую проблему. У меня проблемы с базовым корпусом.

+0

'т = т + 1' бесполезен, потому что после этого 'm' не используется. подумайте о вызове 'return base [0] + replace_str (base [1:], target, rep)' – njzk2

+0

Было бы полезно, если бы вы сказали нам, какие строки вы тестируете, чтобы дать эту ошибку. – alexwlchan

+6

Обе ветки всегда будут снова называться 'replace_str'. Он никогда не убежит. –

ответ

0

В вашей else ветви обновить m и n, но вы не можете передать эти значения к следующему вызову replace_str, который заканчивается снова, начиная с самого начала.

Вам необходимо либо добавить m, либо n в качестве аргументов, либо превратить эту часть функции в цикл.

Использование дополнительных аргументов легче, и выглядит примерно так:

# adding m and n as arguments 
def replace_str(base, target, rep, m=0, n=None): 
    if n is None: 
     n = len(target) 
    ... 

Кроме того, необходимо базовый вариант, самый простой из которых является, вероятно:

# adding m and n as arguments 
def replace_str(base, target, rep, m=0, n=None): 
    if target not in base: 
     return base 
    if n is None: 
     n = len(target) 
    ... 
Смежные вопросы