使用递归确定单词是否是回文

时间:2019-04-13 00:55:13

标签: python

我正在尝试确定给定的单词是否是回文。

我的代码的目标是该函数使用一个单词,并将其删除任何标点符号或空格。如果单词的长度是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回文”。这使得它似乎不再再次调用我的函数。关于为什么发生这种情况有什么建议吗?

2 个答案:

答案 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