2015-02-12 52 views
0

我想写一个Python函数,它返回true一个字符串s是一个回文,即它等于它的反向。例如'racecar'和'abba'是回文。到目前为止,这是我不成功的尝试。递归函数无法返回布尔型

def ispalindrome(s): 
    if len(s) == 1: 
     return s 
    else: 
     reverse = s[-1] + ispalindrome(s[:-1]) 

我没有问题,当我告诉我的函数返回相反,但是,我很困惑,我应该怎么做才能返回一个布尔比较。

def ispalindrome(s): 
    if len(s) == 1: 
     return s 
    else: 
     reverse = s[-1] + ispalindrome(s[:-1]) 
     return a == reverse 

使用上述函数创建以下错误

>>>ispalindrome('racecar') 
Traceback (most recent call last): 
    File "<pyshell#0>", line 1, in <module> 
    ispalindrome('racecar') 
    File "/Users/Nadir/Desktop/Untitled.py", line 24, in ispalindrome 
    reverse = s[-1] + ispalindrome(s[:-1]) 
    File "/Users/Nadir/Desktop/Untitled.py", line 24, in ispalindrome 
    reverse = s[-1] + ispalindrome(s[:-1]) 
    File "/Users/Nadir/Desktop/Untitled.py", line 24, in ispalindrome 
    reverse = s[-1] + ispalindrome(s[:-1]) 
    File "/Users/Nadir/Desktop/Untitled.py", line 24, in ispalindrome 
    reverse = s[-1] + ispalindrome(s[:-1]) 
    File "/Users/Nadir/Desktop/Untitled.py", line 24, in ispalindrome 
    reverse = s[-1] + ispalindrome(s[:-1]) 
TypeError: Can't convert 'bool' object to str implicitly 

现在我完全理解为什么上述错误产生。这是因为一些递归函数返回一个布尔值并尝试将其添加到一个字符串;但我不能做的是如何避免这个错误。

+0

为什么不直接测试第一个和最后一个字符,并在递归之前将它们关闭? – 2015-02-12 03:29:32

+0

我可以,但我正在寻找一种方法,我可以使用生成的“反向”。 – TheValars 2015-02-12 03:32:25

回答

1

一个更好的回文测试可能只是为了确保结束字符是相同的,然后内部字符也是回文,终止条件以零或一个字符的字符串结尾(这是,是定义,回文):

def isPalindrome(s): 
    if len(s) < 2: 
     return True 
    if s[0] != s[-1]: 
     return False 
    return isPalindrome(s[1:-1]) 

print isPalindrome("racecar") 

这是相当困难的努力创造一个优雅的递归解决这个问题的时候,你只能对使用字符串混乱的一个末,因为你需要通过沿着原始字符串进行比较,您目前正在翻转的字符串的剩余部分以及日期反转的字符串,如下所示:

def isPalindrome(orig, reduced, reversed): 
    if reduced == "": 
     return orig == reversed 
    return isPalindrome(orig, reduced[1:], reduced[0] + reversed) 

print isPalindrome("racecar", "racecar", "") 

当然,这样做的整体思路递归是有缺陷的,对教育以外任何东西(因为教育可能是你的目标在这里,没关系为例)。

但请记住,递归的最佳用例是每次递归调用都可以处理大部分“解决方案空间”的地方(见证每次可以处理剩余空间一半的二分查找) 。

足够大的字符串递归函数回文将如下面的功能,经典情况下算法选择差的递归舞台上一样的效果:

def add(unsigned a, unsigned b): 
    if b == 0: 
     return a 
    return add(a+1, b-1) 
中,你可能

在获得答案之前很久就用完了堆栈空间:-)