我正在尝试确定给定的单词是否是回文。
我的代码的目标是该函数使用一个单词,并将其删除任何标点符号或空格。如果单词的长度是0或1,则返回该单词是回文。然后,我检查第一个字母和最后一个字母是否相同。如果不是,则返回它不是回文。如果它们的第一个字母和最后一个字母相同,那么我想用空格替换这两个字母,然后再次调用我的函数。我将字母替换为空格的原因是,它将由初始编辑语句对其进行编辑。
def palindrome(word):
editWord = word.strip(" ").strip("!").strip("?")
stringOne = "A palindrome"
stringTwo = "Not a palindrome"
if len(editWord) == 0 or len(editWord) == 1:
return stringOne
elif editWord[0] != editWord[-1]:
return stringTwo
else:
word = editWord.replace(editWord[0], " ").replace(editWord[-1], " ")
palindrome(word)
return stringOne
print(palindrome("area"))
用单个字母测试时,它也可以正常运行,如果我测试“不是”之类的单词,显然这不是回文。但是,如果我将单词区域称为它,则返回“ A回文”。这使得它似乎不再再次调用我的函数。关于为什么发生这种情况有什么建议吗?
答案 0 :(得分:2)
为了使递归在这里正常工作,您的else语句应大致说明“如果外部字符相同,则单词为回文,其余均为回文”。相反,您的代码是用空格替换所有出现的外部字符 ,并检查该单词是否是回文,并忽略结果始终返回“是”。
您可以使用切片而不是替换来进行适当的递归:
else:
return palindrome(editWord[1:-1])
答案 1 :(得分:0)
另一种替代字母的方法,同时仍然以递归方式进行操作,以跟踪单词中的索引并在递归时递增。这使您不必在每次递归上都制作新的切片。在这种情况下,当索引位于单词的中间时,您的边缘情况就是这样。
def palindrome(word, i = 0):
if i >= len(word)//2:
return True
if word[i] != word[-(i+1)]:
return False
return palindrome(word, i+1)
palindrome("mrowlatemymetalworm") # true