为什么这个回文试验不起作用?

时间:2012-04-24 01:16:12

标签: python

回文是一个向前和向后读取相同的字符串。回文的例子包括“lol”,“abba”,“雷达”和“pickle elkci​​p”。指出它是否在以下文档字符串中描述的所有情况下都有效:'''如果字符串s是回文,则返回True,否则返回False。'''

def palindrome2(s):
    n = len(s)
    pal = True
    for i in range(n/2):
        if s[i] == s[n-i-1]:
            pal = True
        else:
            pal = False
    return pal

我不明白为什么这个功能不起作用。对我来说,似乎功能正常。显然,布尔值被滥用,但我不明白上面的布尔值是如何使用得不好的。有人可以向我解释一下吗?

4 个答案:

答案 0 :(得分:8)

为了好玩,您还可以尝试更简单的方法:

def palindrome(s):
  return s[::-1] == s

(向读者讲解其工作原理)

答案 1 :(得分:6)

循环体被编码的方式pal的值可能会在TrueFalse之间反复变化,具体取决于给定的一对字符是否恰好匹配特别是迭代。

最好检查不等式,将布尔变量pal设置为False,然后立即退出循环。

这样的事情:

def palindrome2(s):
    n = len(s)
    pal = True

    for i in range(n/2)
        if s[i] != s[n-i-1]: # the moment it's false
           pal = False       # set pal and
           break             # drop out of the loop

    return pal

或者,不使用布尔变量:

    ...
    for i in range(n/2)
        if s[i] != s[n-i-1]: # the moment it's false
           return False      # exit the function by returning False

    return True  # otherwise return True

答案 2 :(得分:3)

您始终会检查每个字符。一旦你明确知道结果,你需要立即返回。

答案 3 :(得分:3)

@ ulmangt的解决方案非常聪明,但我不那么神秘:

def palindrome(s):
    return all(( s[i] == s[-(i+1)] for i in range(len(s)/2) ))

至少它只进行了一半的比较; - )