return
陈述
当我第一次开始学习递归时,这个问题实际上花了我很长时间才掌握。
在处理 Python 函数/方法时要记住的一件事是,无论如何它们总是一个值。 return
所以假设你忘记return
在你的函数/方法的主体中声明一个语句,Python 会为你处理它并return None
在它的最后做。
这意味着,如果您在函数体中搞砸并放错了return
或省略了它,而不是预期的返回,您print type(messed_up_function())
将打印NoneType
。
递归修复
现在考虑到这一点,在处理递归时,首先要确保除了归纳案例之外还有一个基本案例,即防止无限递归循环。
接下来,确保你在两种情况下都返回,所以像这样:
def recur(val):
"""
takes a string
returns it back-to-front
"""
assert type(val) == str
# the base case
if len(val) == 1:
return val
# the inductive case
else:
return val[-1] + recur(val[:-1]) # reverses a string char by char
所以它的作用是它总是return
s 并且是 100% 无限递归证明,因为它有一个有效的基本情况,并且在每个归纳步骤中都有一个递减的长度。
Stack Viewer 调试递归函数
recur('big')
如果我们在基本情况开始时使用添加的内容运行assert False
,我们将具有以下堆栈结构:
从中我们可以看到,在每一个递归步骤中,我们都有val
,这是这个函数的唯一参数,它越来越小,直到len(val) == 1
它到达,然后它到达最终的返回,或者在这种情况下assert False
。所以这只是调试递归函数/方法的一种方便方法。在IDLE中,您可以通过调用Debug > Stack Viewer
shell 来访问这样的视图。