显然,它应该在最后两行的末尾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))
对你的版本做一个小的调整,以便更好地理解发生了什么:
现在运行
is_palindrome('abcba')
将打印正如我认为您对递归方法的期望,除了在输出的末尾没有
True
。你可以看到,首先你调用is_palindrome('abcba')
,然后is_palindrome('bcb')
,然后is_palindrome('c')
。最后一个调用将True
返回给第二个调用,第二个调用将None
返回给第一个调用,第一个调用最终返回None
,正如您在is_palindrome('abcba') is None
中看到的那样。正如前面提到的,这就是为什么需要最后一行前面的return
语句的原因:它关系到原始调用将返回什么,因此即使在某个点到达return True
,这也不是代码的输出。你知道吗我希望这有帮助。你知道吗
注意:检查字符串是否是回文要容易得多:只要检查
word == word[::-1]
。你知道吗原因是,从函数返回的布尔值是回文的if条件。因此,当您递归地应用它时,您的基本情况将以真/假值退出。在else条件下进行递归调用时,需要返回该值。这就是递归树在整个树的深度中保持所需布尔值的方式。你知道吗
return True
只从调用它的函数的单个实例返回。由于这是一个递归函数,因此最终会得到一堆函数实例,如下所示:递归最终在最后一个(字符串长度为1)中到达其基本情况并返回
True
。问题是,它只返回到is_palindrome('cdc')
实例。从这里开始,由于您没有告诉函数对结果执行任何操作,它只返回None
到下一个实例。类似地,None
通过堆栈传播回初始函数调用。那不是很有用。你知道吗当您
return
取而代之的是递归调用的结果时,这将导致函数的每个实例获取下一个实例返回的内容,并将其传递回上一个实例,一直传递到原始调用。换句话说,它创建了一个链,允许最终结果一路传播回用户。你知道吗相关问题 更多 >
编程相关推荐