我没理解,如何归还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)
基本上代码是记录所有路径(从0开始)。谁先获得100,将被退回。 isGoal()
用于检查路径的最后一项是否为100. anotherList
是随机数的小列表(从0到100)。
答案 0 :(得分:14)
return
声明当我第一次开始学习递归时,这个问题实际上花了我很长时间才掌握。
在处理Python函数/方法时要记住的一件事是,无论如何,总是 return
一个值。所以说你忘记在你的函数/方法的主体中声明一个return
语句,然后Python会为你处理它,并在它结尾处return None
。
这意味着如果你搞砸了这个功能的主体并错放了return
或者忽略了它,而不是预期的回报,print type(messed_up_function())
会打印NoneType
。< / p>
现在考虑到这一点,在处理递归时,首先要确保除归纳案例之外还有基本案例,即。防止无限递归循环。
接下来,请确保您在两种情况下都返回,如下所示:
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
并且是100%无限递归证明,因为它具有有效的基本情况和每个归纳步骤的递减长度。
如果我们在基本案例的开头使用添加的recur('big')
运行assert False
,我们将拥有此堆栈结构:
从中我们可以看到,在每个递归步骤中,我们都有val
,它是此函数的唯一参数,越来越小,直到达到len(val) == 1
然后达到最终返回,或者在这种情况下assert False
。所以这只是调试递归函数/方法的一种方便方法。在IDLE中,您可以通过调用shell中的Debug > Stack Viewer
来访问此类视图。
答案 1 :(得分:1)
功能如下:
def recursion(aList):
if isGoal(aList[-1]):
return aList
for item in anotherList():
newList = list(aList)
newList.append(item)
recursion(newList) # here you ignore what recursion returns
# when execution reaches this point, nothing is returned
如果执行到达我添加的注释,则在for循环完成后,该函数退出并且不返回任何内容。当您在未执行return
语句的情况下退出函数时,将返回None
。您必须确保从递归函数返回一些内容。
我不能告诉你如何重写这个功能,因为我不知道它想要做什么。对我来说,如何改变它是非常明显的。但是,我完全可以肯定地说,你必须归还一些东西!