【问题标题】:Recursive function cannot return a boolean递归函数不能返回布尔值
【发布时间】:2015-04-12 16:08:56
【问题描述】:

我想写一个 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

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

【问题讨论】:

  • 为什么不只测试第一个和最后一个字符,然后在递归之前将它们切掉?
  • 我可以,但我正在寻找一种可以使用产生的“反向”的方法。

标签: python-3.x recursion boolean


【解决方案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")

当您只能在 one 结尾处弄乱字符串时,尝试为这个问题创建一个优雅的递归解决方案是相当困难的,因为您需要传递原始字符串进行比较,您当前正在反转的字符串的剩余部分,以及迄今为止反转的字符串,例如:

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)

在你得到答案之前你可能会用完堆栈空间:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-08
    • 2021-01-06
    • 2018-08-02
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    相关资源
    最近更新 更多