我不明白,我怎么能回来List而不是None?
class foo():
def recursion(aList):
if isGoal(aList[-1]):
return aList
for item in anotherList:
newList = list(aList)
newList.append(item)
recursion(newList)
someList = [0]
return recursion(someList)
Run Code Online (Sandbox Code Playgroud)
基本上代码是记录所有路径(从0开始).谁先获得100,将被退回.isGoal()是检查路径的最后一项是否为100.并且anotherList是一个小的随机数列表(从0到100).
Mor*_*lde 14
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
Run Code Online (Sandbox Code Playgroud)
所以它的作用总是returns并且是100%无限递归证明,因为它在每个归纳步骤具有有效的基本情况和递减的长度.
如果我们将在基本案例的开头recur('big')添加assert False,我们将拥有这个堆栈结构:

从中我们可以看到,在每个递归步骤中,我们有val,这是该函数的唯一参数,越来越小,直到它命中len(val) == 1,然后到达最终返回,或者在这种情况下assert False.所以这只是调试递归函数/方法的一种方便方法.在IDLE中,您可以通过调用Debug > Stack Viewershell 来访问此类视图.
| 归档时间: |
|
| 查看次数: |
6424 次 |
| 最近记录: |