python递归返回无类型

lap*_*aph 4 python recursion

我不明白,我怎么能回来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%无限递归证明,因为它在每个归纳步骤具有有效的基本情况和递减的长度.

Stack Viewer用于调试递归函数

如果我们将在基本案例的开头recur('big')添加assert False,我们将拥有这个堆栈结构:

范围

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