python递归返回None类型

python递归返回None类型,python,recursion,Python,Recursion,我不明白,如何返回列表而不是无 class foo(): def recursion(aList): if isGoal(aList[-1]): return aList for item in anotherList: newList = list(aList) newList.append(item) recursion(newList) some

我不明白,如何返回
列表而不是

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。另一个列表是一个小的随机数列表(从0到100)

功能如下:

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
。您必须确保从递归函数返回一些内容

我无法建议您如何重新编写函数,因为我不知道它试图做什么。对我来说,它需要如何改变还很不明显。然而,我可以完全自信地说,你必须归还一些东西

return
语句 当我第一次开始学习递归时,这个问题实际上花了我相当长的时间去理解

在处理Python函数/方法时需要记住的一件事是,无论发生什么情况,它们总是返回一个值。因此,假设您忘记在函数/方法的主体中声明一个
return
语句,那么Python会为您处理它,并在它的末尾执行
returnnone

这意味着,如果你把函数体搞砸了,把
返回的
放错了位置,或者忽略了它,你的
打印类型(混乱的函数())
将打印
非类型的

递归修复 考虑到这一点,在处理递归时,首先要确保在归纳情况之外还有一个基本情况,即防止无限递归循环

下一步,确保两种情况下都返回,如下所示:

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
所以它总是
返回
s,并且是100%无限递归证明,因为它有一个有效的基本情况和每个归纳步骤的递减长度

用于调试递归函数的堆栈查看器 如果我们运行
recur('big')
,并在基本情况开始时添加
assert False
,我们将使用以下堆栈结构:


从中我们可以看到,在每个递归步骤中,我们都有
val
,这是该函数的唯一参数,它变得越来越小,直到它到达
len(val)==1
,然后到达最终返回,或者在本例中是
断言False
。因此,这只是调试递归函数/方法的一种简便方法。在中,您可以通过调用shell中的
Debug>stackviewer
来访问这样的视图。

是的。
返回不应进入循环。起初,我认为它应该是一个
扩展
,没有
for
循环+
.append
(我正在写),但它也有不同的逻辑。但最终,这个解决方案对递归并没有任何作用,所以这也不太可能是正确的。(OP至少应该获得一个对
递归返回的内容的引用,并对其进行处理。我想说OP的代码可能需要一些帮助:)@mgilson这个解决方案确实对递归进行了处理。解决方案是确保递归函数始终返回。答案中的代码与问题相同。那肯定坏了。但是解决方案是好的,返回一些东西。@DavidHeffernan基本上我所做的是尝试获取所有从0开始的列表的记录,谁先得到100,谁就会返回
isGoal()
函数检查列表的最后一项是否为100。而
另一个列表
是一个0到100之间随机数的小列表(最多3个)。你怎么能修复我的代码?我还是不太明白你的函数要做什么。我想我回答了你实际提出的问题。很抱歉,您觉得它没有帮助。可能是