为什么这个回文函数会失败?

2024-03-28 22:23:00 发布

您现在位置:Python中文网/ 问答频道 /正文

显然,它应该在最后两行的末尾return is_palindrome(middle(word))。但为什么呢?函数不应该在return True之后停止吗?你知道吗

def first(word):
    return word[0]

def last(word):
    return word[-1]

def middle(word):
    return word[1:-1]

def is_palindrome(word):
    #base case
    if len(word) <= 1:
        return True
    if first(word) != last(word):
        return False
    else:
        is_palindrome(middle(word))

Tags: 函数truemiddlebaselenreturnifis
3条回答

对你的版本做一个小的调整,以便更好地理解发生了什么:

def first(word):
    return word[0]

def last(word):
    return word[-1]

def middle(word):
    return word[1:-1]

def is_palindrome(word):
    #base case
    if len(word) <= 1:
        print(1)
        return True
    if first(word) != last(word):
        print(2)
        return False
    else:
        print(3)
        is_palindrome(middle(word))

现在运行is_palindrome('abcba')将打印

3
3
1

正如我认为您对递归方法的期望,除了在输出的末尾没有True。你可以看到,首先你调用is_palindrome('abcba'),然后is_palindrome('bcb'),然后is_palindrome('c')。最后一个调用将True返回给第二个调用,第二个调用将None返回给第一个调用,第一个调用最终返回None,正如您在is_palindrome('abcba') is None中看到的那样。正如前面提到的,这就是为什么需要最后一行前面的return语句的原因:它关系到原始调用将返回什么,因此即使在某个点到达return True,这也不是代码的输出。你知道吗

我希望这有帮助。你知道吗

注意:检查字符串是否是回文要容易得多:只要检查word == word[::-1]。你知道吗

def first(word):
 return word[0]

def last(word):
 return word[-1]

def middle(word):
 return word[1:-1]

def is_palindrome(word):
 #base case
 if len(word) <= 1:
     return True
 if first(word) != last(word):
     return False
 else:
     return is_palindrome(middle(word))

print(is_palindrome("racecar"))

原因是,从函数返回的布尔值是回文的if条件。因此,当您递归地应用它时,您的基本情况将以真/假值退出。在else条件下进行递归调用时,需要返回该值。这就是递归树在整个树的深度中保持所需布尔值的方式。你知道吗

return True只从调用它的函数的单个实例返回。由于这是一个递归函数,因此最终会得到一堆函数实例,如下所示:

is_palindrome('abcdcba')
  is_palindrome('bcdcb')
    is_palindrome('cdc')
      is_palindrome('d')

递归最终在最后一个(字符串长度为1)中到达其基本情况并返回True。问题是,它只返回到is_palindrome('cdc')实例。从这里开始,由于您没有告诉函数对结果执行任何操作,它只返回None到下一个实例。类似地,None通过堆栈传播回初始函数调用。那不是很有用。你知道吗

    ^ None ^
is_palindrome('abcdcba')
      ^ None ^
  is_palindrome('bcdcb')
        ^ None ^
    is_palindrome('cdc')
          ^ True ^
      is_palindrome('d')

当您return取而代之的是递归调用的结果时,这将导致函数的每个实例获取下一个实例返回的内容,并将其传递回上一个实例,一直传递到原始调用。换句话说,它创建了一个链,允许最终结果一路传播回用户。你知道吗

    ^ True ^
is_palindrome('abcdcba')
      ^ True ^
  is_palindrome('bcdcb')
        ^ True ^
    is_palindrome('cdc')
          ^ True ^
      is_palindrome('d')

相关问题 更多 >