Почему у меня здесь бесконечный l oop, когда ввод «baab»? (Python) - PullRequest
0 голосов
/ 21 февраля 2020

Идея этого алгоритма состоит в том, чтобы удалить 2 одинаковые буквы подряд, поэтому я решил сделать это с рекурсивностью: если слово (цепочка) имеет 2 последовательных буквы, логическая переменная, которую я назвал doublee, должна быть False и, если это так, мы переделываем алгоритм с новым словом (которое является исходным, но без пар последовательных букв). Если значение doublee равно True, тогда алгоритм должен остановиться и вернуть отредактированное слово. И проблема в том, что у меня есть бесконечное l oop, когда аргумент ('baab'). Фактически, с первой попытки, «aa» удаляется, поэтому у нас теперь есть «bb», но я знаю, почему он не просто повторяет то, что мы делали раньше. Вот код:

def musique(chaine) :

   L = list(chaine)
   for i in range(len(chaine)-1) :
       if L[i] == L[i+1] :
           L[i], L[i+1] = 0, 0
   chaine = ''
   for i in L :
       if i != 0 :
           chaine += i

   doublee = True

   for i in range(len(chaine)-1) :
       if chaine[i] == chaine[i+1] :
           doublee = False

   while doublee == False :
       musique(chaine)

   return chaine

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Номер 1: Между двоеточием и концом оператора не должно быть пробелов.

Номер 2: Когда вы снова вызываете musique, все ваши аргументы находятся в одной области видимости, поэтому вы эффективно сбрасываете программа. L будет сброшен, а также будут цепляться и дублироваться, ваша программа будет продолжать делать то же самое вечно.

0 голосов
/ 21 февраля 2020

Вам не нужны while l oop. Просто пусть каждый уровень рекурсии проверяет, есть ли двойники. Если они есть, он вызывает себя рекурсивно, чтобы удалить их, в противном случае он возвращает.

def musique(chaine) :

   L = list(chaine)
   for i in range(len(chaine)-1) :
       if L[i] == L[i+1] :
           L[i], L[i+1] = 0, 0
   chaine = ''
   for i in L :
       if i != 0 :
           chaine += i

   for i in range(len(chaine)-1) :
       if chaine[i] == chaine[i+1] :
           return musique(chain)

   return chaine
...