繁体   English   中英

为什么回文功能失败?

[英]Why does this palindrome function fail?

显然,它应该在最后两行的结尾处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))

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')
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"))

原因是,您要从函数is_palindrome的if条件返回布尔值。 因此,当您递归应用它时,您的基本情况将以true / false值退出。 你需要当你在其他条件的递归调用返回该值。 这就是递归树如何在整个树的深度中保持所需的布尔值存储的方式。

对您的版本进行一些小的调整,以更好地了解正在发生的事情:

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返回到第一个调用,并且第一个最终将返回Noneis_palindrome('abcba') is None 这就是为什么如上所述需要最后一行前面的return语句的原因:原始调用将返回的内容很重要,因此即使在某个时候达到了return True ,这也不是代码的输出。

希望对您有所帮助。

PS:检查字符串是否是回文容易得多:只需检查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
    elif first(word) != last(word):
        return False
    else:
        return is_palindrome(middle(word))

在这里,代码就像递归一样工作,函数is_palindrome返回true或false,但是您没有使用它。

is_palindrome('ana')
 is_palindrome('n')
  return True
 return True
return True

Rawing通过添加“ return”已经解决了您的问题。 关于您的“仍然不了解它是如何工作的”评论:这是一个递归函数。 首先,递归可能很难理解。 如果您认为这不是一个调用,而是整个调用过程,而只有最后一个返回true或false,则可能会有所帮助。 另外,您可以省略“ else:”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM