Проверка, является ли строка палиндромом, возвращает неверный результат

#python #recursion

#python #рекурсия

Вопрос:

Я пытаюсь проверить, является ли строка палиндромом, используя рекурсию. В настоящее время я просто пытаюсь разработать простые случаи.

Моя функция принимает в качестве входных данных строку. Затем он удаляет знаки препинания. Следующее, что я делаю, это проверяю, равна ли первая буква слова последней букве слова. Если это так, то он возвращает строку один. Если это не так, то возвращается вторая строка.

 def palindrome(word):    
    stringOne = "It's a palindrome"
    stringTwo = "It's not a palindrome"
    edit = word.strip("!").strip(",").strip("")

    if edit[0] == edit[-1]:
        return stringOne 
    else:
        return stringTwo

print(palindrome("Yay!"))
  

Код запущен. Однако ввод строки «Yay!» (которая является палиндромом) возвращает «Это не палиндром». Есть ли причина, по которой мое if утверждение не работает?

Комментарии:

1. Во-первых, вы сравниваете только первый символ с последним. Во-вторых, вы сравниваете заглавную букву со строчной ошибкой, то есть «Y» против «y». Чтобы правильно проверить палиндром, вам нужно будет проверять каждую букву слева на каждую букву справа и перебирать следующие символы, продвигаясь в противоположных направлениях.

Ответ №1:

Помимо проблемы с регистром букв, на которую @RWRkeSBZ указывает в комментариях, это хороший пример того, где использование рекурсивной вспомогательной функции имеет смысл. Как только вы очистите строку, чтобы она содержала только буквы, нет причин делать это снова при рекурсии. Вместо этого у нас есть вызываемая нами процедура, которая решает эти проблемы, и более целенаправленная, рекурсивная вспомогательная функция, которая выполняет реальную обработку:

 def palindrome_recursive(letters):
    if len(letters) <= 1:
        return True

    if letters[0] != letters[-1]:
        return False

    return palindrome_recursive(letters[1:-1])

def palindrome(phrase):
    stringOne = "It's a palindrome"
    stringTwo = "It's not a palindrome"

    edit = phrase.strip("!,").strip().lower()

    if palindrome_recursive(edit):
        return stringOne

    return stringTwo

print(palindrome("Able was I ere I saw Elba!"))