python递归返回无类型

时间:2013-03-11 13:49:44

标签: 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)

基本上代码是记录所有路径(从0开始)。谁先获得100,将被退回。 isGoal()用于检查路径的最后一项是否为100. anotherList是随机数的小列表(从0到100)。

2 个答案:

答案 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%无限递归证明,因为它具有有效的基本情况和每个归纳步骤的递减长度。

用于调试递归函数的Stack Viewer

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

scope

从中我们可以看到,在每个递归步骤中,我们都有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。您必须确保从递归函数返回一些内容。

我不能告诉你如何重写这个功能,因为我不知道它想要做什么。对我来说,如何改变它是非常明显的。但是,我完全可以肯定地说,你必须归还一些东西!