2016-11-26 2 views
1

Этот код должен взять строку и вернуть строку без повторений символов (нет «aa», «bb», «55» и т. Д.). работает через рекурсию: функция вызывает себя, уточняя строку до тех пор, пока она не будет повторять, но затем возвращает исходную строку. Я не могу понять, как ее исправить. Код ниже, извините, если вопрос слишком тривиален, но он не ко мне. Спасибо за ваше внимание. (и извините за «взлом» в заголовке форматирования)pПроблема с рекурсией и областью действия в функции (Python)

def removeRepetitions(s): 
    result="" 
    for i in range(len(s)-1): 
     if len(s)!=1 and s[i]==s[i+1]: 
      result=s[:i+1]+s[i+2:] 
      removeRepetitions(result) 
      return result 

ответ

1

Если отступы правильно, то ваше возвращенное значение имеет неправильные отступы, и вы не назначая return из ваша рекурсивная функция. Вам также необходимо назначить result - s в начале не пустая строка. Ваш терминал случае должен вернуть один символ в s:

def removeRepetitions(s): 
    result = s 
    for i in range(len(s)-1): 
     if len(s)!=1 and s[i]==s[i+1]: 
      result = removeRepetitions(s[:i+1]+s[i+2:]) 
    return result 

>>> removeRepetitions('Mississippi') 
'Misisipi' 

Но вы, кажется, смешивания рекурсивные и итеративные решения, более рекурсивное решение не требует for цикла:

def removeRepetitions(s): 
    if len(s) <= 1: 
     return s 
    c, s = s[0], removeRepetitions(s[1:]) 
    if c == s[0]: 
     return s 
    return c+s 

>>> removeRepetitions('Mississippi') 
'Misisipi' 
1

главное, что вам не хватает, это операторы возврата, чтобы охватить все возможности. Вам также не нужна промежуточная переменная result. После коррекции отступы:

def removeRepetitions(s): 
    for i in range(len(s) - 1): 
     if s[i] == s[i+1]: # found a dup! 
      # Assemble a return value by taking everything prior to the 
      # duplicate (which is duplicate free) and concatenating the 
      # result of removing duplicates from the remainder of the 
      # input string, excluding the first of the duplicated chars 
      return s[:i] + removeRepetitions(s[i+1:]) 
    return s # return input string if we made it through w/o any duplicates 

print(removeRepetitions("aaaabccdddeee")) # => "abcde" 

Также отметим, что с окончательным return заявления, проверка len(s)!=1 является постороннее.

Смежные вопросы