3

回文是一个向前和向后读取相同的字符串。回文的例子包括“lol”、“abba”、“radar”和“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

4 回答 4

8

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

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

(关于它如何工作的练习留给读者)

于 2012-04-24T01:22:16.197 回答
6

循环体的编码方式pal可能会反复变化TrueFalse具体取决于在特定迭代期间给定的字符对是否碰巧匹配。

最好检查不等式,然后将您的布尔变量设置palFalse并立即退出循环。

像这样的东西:

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
于 2012-04-24T01:17:48.193 回答
3

你总是检查每一个字符。您需要在明确知道结果后立即返回。

于 2012-04-24T01:17:29.893 回答
3

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

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

至少它做了一半的比较;-)

于 2012-04-24T01:42:27.997 回答