Python回文程序不起作用

时间:2015-05-17 15:08:58

标签: python recursion palindrome

我在python中写了一个简单的程序,检查句子是否是回文。但我无法弄清楚为什么它不起作用。结果总是错误的。有谁知道什么是错的?

def isPalindrome(word):
    # Removes all spaces, and lowercase the word.
    word = word.strip().lower()
    word = word.replace(" ", "")

    # If the length of the word is less than 1, means its a palindrome
    if (len(word) <= 1):
        return True

    # Compares the first and the last character of the word.
    # If it is the same, calls the function again with the same word,
    # without its first and last characters. If its not the same, its
    # not palindrome
    else:
        if word[0] == word[-1]:
            isPalindrome(word[1:-1])
        else:
            return False


sentence = input("Enter a sentence: \n")

if (isPalindrome(sentence)):
    print("The sentence %s is palindrome." % sentence)
else:
    print("The sentence %s is NOT palindrome" % sentence)

7 个答案:

答案 0 :(得分:5)

您没有返回该功能的结果。

替换:

if word[0] == word[-1]:
    isPalindrome(word[1:-1])

if word[0] == word[-1]:
    return isPalindrome(word[1:-1])

答案 1 :(得分:3)

你这样做比以前更复杂:

def palindrome(sentence):
    sentence = sentence.strip().lower().replace(" ", "")
    return sentence == sentence[::-1]

sentence[::-1]使用string slicing来反转字符串中的字符。

一个稍微详细的解决方案,显示上述return语句的逻辑如何工作:

def palindrome(sentence):
    sentence = sentence.strip().lower().replace(" ", "")
    if sentence == sentence[::-1]:
        return True
    else:
        return False

答案 2 :(得分:2)

你的算法很好,唯一的问题是你没有通过递归返回真实的结果,你必须在递归调用它时返回isPalindrome结果:

else:
    if word[0] == word[-1]:
        return isPalindrome(word[1:-1]) #this changed
    else:
        return False

答案 3 :(得分:1)

在Python中检查单词的最佳方法如下:

var[::] == var[::-1]

但是,了解Python在您var[::-1]时会创建新的字符串副本非常重要,因为Python内部不知道反向操作是否会导致相同的字符串。因此,对它的编码方式是创建它的新副本。因此,当您尝试var[::1] is var[::-1]时,您会得到FALSE

例如:

var = "RADAR" var1 = var[::] var is var1 True var2 = var[0:6:1] var is var2 True var3 = var[::-1] var is var3 False var4 = var[-1:-6:-1] var is var4 False var1 'RADAR' var2 'RADAR' var3 'RADAR' var4 'RADAR'

在这里您可以看到前进时它没有创建“ RADAR”的副本,它使用了相同的引用。由于PY内部了解此操作,因此将导致相同的字符串对象。 但是,当您向后移动时,结果可能会有所不同。例如,如果我对“ Ethans”执行相同的操作,则相反的操作将不相同。因此,PY不知道反向字符串的结果是什么,它会创建它的新副本。

因此,反向字符串使用'is'运算符返回假值。

这里需要注意的另一点有趣。参见以下示例:

var = "abc" var1 = "abc" var is var1 True var = "Ethans Baner Pune" var1 = "Ethans Baner Pune" var is var1 False

我们知道字符串是不可变的,并且遵循Singleton DP,那么为什么第二种情况返回FALSE?

这是因为PY不想在速度和性能上妥协。如果您写的字符串很长并且已经存在于内存中,则PY应该引用相同的字符串。但是,发现长字符串将花费很长时间,并且性能会降低。因此,PY不用引用现有的字符串,而是创建一个新的字符串。对于整数,我们也已经了解了这一点,在整数中,它仅遵循Singleton DP方法直到达到极限值(256)。

让我们再看一个示例:

var = "abcdefgh" var1 = "abcdefgh" var is var1 True var = "abcd efgh" var1 = "abcd efgh" var is var1 False

答案 4 :(得分:0)

您需要更换&#34;输入&#34;使用&#34; raw_input&#34;。 此外,你递归调用isPalindrome,这里也有一个错误。它应该是:

if word[0] == word[-1]:
    return isPalindrome(word[1:-1])
else:
    return False

检查下面的更正代码:

def isPalindrome(word):
    # Removes all spaces, and lowercase the word.
    word = word.strip().lower()
    word = word.replace(" ", "")

    # If the length of the word is less than 1, means its a palindrome
    if (len(word) <= 1):
        return True

# Compares the first and the last character of the word.
# If it is the same, calls the function again with the same word, without its first and last characters.
# If its not the same, its not palindrome
    if word[0] == word[-1]:
        return isPalindrome(word[1:-1])
    else:
        return False


sentence = raw_input("Enter a sentence: \n")

if (isPalindrome(sentence)):
    print("The sentence %s is palindrome." % sentence)
else:
    print("The sentence %s is NOT palindrome" % sentence)

答案 5 :(得分:0)

我认为这是一个赋值,并且递归是必要的,显然return word == word[::-1]更简单但并不真正相关。您可以更简洁地编写递归函数:

def isPalindrome(word):
    if not word:
        return True
    return word[0] == word[-1] and isPalindrome(word[1:-1])

word[0] == word[-1]将为TrueFalse,因此您将获得一个空字符串not wordTrue,以便递归结束并且函数返回Trueword[0] == word[-1]将为False,因此该函数将返回False,因为and isPalindrome(word[1:-1])永远不会被评估。

我也可以在功能之外进行降低:

def isPalindrome(word):
    if not word:
        return True
    return word[0] == word[-1] and isPalindrome(word[1:-1])


sentence = input("Enter a sentence: \n")
sentence = sentence.strip().lower()
sentence = sentence.replace(" ", "")
if isPalindrome(sentence):
    print("The sentence %s is palindrome." % sentence)
else:
    print("The sentence %s is NOT palindrome" % sentence)

答案 6 :(得分:0)

由于已经解释了错误并且已经采用了明显的s == s[::-1],我只是将原始版本的可能最小版本投入到混合中:

def isPalindrome(s):
    s = s.strip().lower()
    return not s or s[0] == s[-1] and isPalindrome(s[1:-1])

请注意,您不需要replace(" ", "")。现在用strip()移除外部空间,内部的空格将在strip()之后被移除,在更深入到递归的调用中(如果我们不提前停止,因为s[0] == s[-1]失败了。)