2016-07-23 4 views
-1

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

def isPalindrome(S): 
    listush=list(S) #listush=['a', 'b', 'n', 'n', 'b', 'a'] 
    length=len(listush) #length=6 
    if length==0 or length==1: 
     return S, "is a palindrome!" 
    elif listush[0]!=listush[-1]: 
     return S, "is not a palindrome!" 
    else: 
     del listush[0] 
     del listush[-1] 
     return isPalindrome(S) 

print isPalindrome("abnnba") 
+1

'del listush [0]' и 'listush [-1]' не удалять символы из 'S', список больше не имеет отношения к' S'. Вы передаете исходную строку в рекурсию, не удаляя передние и задние символы. – dhke

ответ

0

Есть некоторые вещи, которые я хотел бы сказать о вашем коде

  • Вы можете отправить срез списка, избавляя вас от удаления элементов.
  • Не нужно преобразовывать его в список, все необходимые операции в поиске палиндрома поддерживаются строками.
  • Вы возвращаете S в рекурсивной функции, которая будет пустым списком (или строкой) , потому что она уменьшает каждую рекурсию. В рекурсивных случаях, я предлагаю вам просто вернуть True или False

Вот пример.

def isPalindrome(S): 
    length=len(S) 
    if length < 2: 
     return True 
    elif S[0] != S[-1]: 
     return False 
    else: 
     return isPalindrome(S[1:length - 1]) 

Простой в этом.

1

Первого из всех, введите свой код правильно.

Во-вторых, вы снова вызываете функцию с тем же аргументом. Позвоните в список «listush», из которого вы удаляете или удаляете из «S» и рекурсируете с аргументом S.

0

Если вы делаете print(listush), вы можете видеть, что ваш список никогда не изменяется. Следующая модификация кода работы:

def isPalindrome(testStr, orig=None): 
    if orig is None: 
     orig = testStr 
    length = len(testStr) #length=6 
    print(testStr) 
    if length == 0 or length == 1: 
     return orig, "is a palindrome!" 
    elif testStr[0] != testStr[-1]: 
     return orig, "is not a palindrome!" 
    else: 
     return isPalindrome(testStr[1:-1], orig) 

print isPalindrome("abnnba") 
1

Там нет необходимости в создании списка. Строка python уже является индексируемой последовательностью.

Даже лучше, мы можем использовать нарезку и пусть функция возврата True и False вместо кортежа с текстом, со всем этим, isPalindrome() становится один вкладыш:

def isPalindrome(S): 
    return len(S) < 2 or (S[0] == S[-1] and isPalindrome(S[1:-2])) 

print isPalindrome('A') 
>>> True 
print isPalindrome('AA') 
>>> True 
print isPalindrome('BAAB') 
>>> True 
print isPalindrome('ABAB') 
>>> False