#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!"))