2015-03-11 2 views
-1

У меня есть этот код, который должен сломаться, если он выполняет определенное условие, то есть когда функция isuniquestring (listofchar) возвращает True, но иногда она этого не делает, и она переходит в бесконечный цикл. Я попробовал распечатать условие, чтобы проверить, что что-то не так с условием, но даже когда условие напечатано верно, функция все еще продолжает работать, я понятия не имею, почему.Почему моя рекурсивная функция Python не сломается?

Одна из строк, которая генерирует бесконечный цикл, является «thisisazoothisisapanda», поэтому, когда я получаю список повторений ('thisisazoothisisapanda'), он переходит в бесконечный цикл.

был бы очень благодарен, если бы кто-то мог помочь спасибо!

Вот мой код:

def getunrepeatedlist(listofchar): 
    for ch in listofchar: 
     if isrepeatedcharacter(ch,listofchar): 
      listofindex = checkrepeatedcharacters(ch,listofchar) 
      listofchar = stripclosertoends(listofindex,listofchar) 
      print (listofchar) 
      print (isuniquestring(listofchar)) 
      if isuniquestring(listofchar): 
       return listofchar 
       #print (listofchar) 
      else: 
       getunrepeatedlist(listofchar) 

    return listofchar 

только для справки, эти функции я назвал

def isrepeatedcharacter(ch,list): 
if list.count(ch) == 1 or list.count(ch) == 0: 
    return False 
else: 
    return True 

def checkrepeatedcharacters(ch,list): 
listofindex=[] 
for indexofchar in range(len(list)): 
    if list[indexofchar] == ch: 
     listofindex.append(indexofchar) 
return listofindex 

def stripclosertoends(listofindices,listofchar): 
stringlength = len(listofchar)-1 
if listofindices[0] > (stringlength-listofindices[-1]): 
    newstring = listofchar[:listofindices[-1]] 

elif listofindices[0] < (stringlength-listofindices[-1]): 
    newstring = listofchar[listofindices[0]+1:] 

elif listofindices[0] == (stringlength-listofindices[-1]): 
    beginningcount = 0 
    endcount = 0 
    for index in range(listofindices[0]): 
     if isrepeatedcharacter(listofchar[index],listofchar): 
      beginningcount += 1 
    for index in range(listofindices[-1]+1,len(listofchar)): 
     if isrepeatedcharacter(listofchar[index],listofchar): 
      endcount += 1 
    if beginningcount < endcount: 
     newstring = listofchar[:listofindices[-1]] 
    else: 
     #print (listofindices[0]) 
     newstring = listofchar[listofindices[0]+1:] 
     #print (newstring) 

return newstring 

def isuniquestring(list): 
if len(list) == len(set(list)): 
    return True 
else: 
    return False 
+2

Что такое 'isuniquestring'? И, если на то пошло, все остальные функции, которые вы называете? – jedwards

+0

uniquestring проверяет, имеет ли строка повторяющиеся символы, isrepeatedcharacter проверяет, является ли этот символ повторяющимся, и возвращает true или false, checkrepeatedcharacters проверяет индексы повторений этого символа и возвращает список, а stripclosertoends удаляет все повторяющийся символ, который ближе к любому концу строки. извините за начальную неопределенность, подумал, что будет слишком долго публиковать весь код здесь – user3881923

+0

@ user3881923 Единственное, что приходит в голову здесь, это то, что либо «checkrepeatedcharacters» в какой-то момент начинают сравнивать сам символ, что означает 'stripclosertoend' never полоса одного символа. Или 'stripclosertoend' начинает работать некорректно в какой-то момент. Не видя кода для тех, маловероятно, что люди смогут вам помочь. – ljetibo

ответ

0

Это может быть связано с тем, что вы меняете listofchar в ваш цикл. Попробуйте клонировать эту переменную в новое имя и использовать эту переменную для манипуляций и вернуть новую переменную.

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