[英]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
返回到第一个调用,并且第一个最终将返回None
如is_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.