递归函数不能返回布尔值

时间:2015-02-12 03:23:52

标签: python-3.x recursion boolean

我想编写Python函数,返回true,字符串s是回文,也就是说,它等于反向。例如'racecar'和'abba'是回文。到目前为止,这是我不成功的尝试。

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

当我告诉我的函数返回反向时,我没有问题,但是,我很困惑我应该如何进行比较才能返回一个bool。

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

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

1 个答案:

答案 0 :(得分: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", "")

当然,除了教育之外,递归这样做的整个想法是有缺陷的(因为教育可能是你的目标,可以作为一个例子)。

但请记住,递归的最佳用例是每次递归调用可以处理大量“解决方案空间”的情况(见证二进制搜索,每次可以处理剩余空间的一半)。

用于递归回文函数的足够大的字符串将具有与以下函数相同的效果, classic 在递归领域中选择不良算法的情况:

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

因为你得到答案之前很久就会耗尽堆栈空间: - )