【问题标题】:python recursion return None typepython递归返回无类型
【发布时间】:2013-02-26 17:30:41
【问题描述】:

我不明白,如何返回 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)。

【问题讨论】:

标签: python recursion


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

我无法建议您如何重写该函数,因为我不知道它要做什么。对我来说,它需要如何改变远非显而易见。但是,我可以完全自信地说,你必须回报一些东西!

【讨论】:

  • 是的。 return 不应该进入循环。起初我认为它应该是一个 extend 没有 for 循环 + .append (我正在写),但这也有不同的逻辑。但最终,这个解决方案对递归什么都不做,所以这也不太可能是正确的。 (OP 至少应该参考 recursion 返回的内容并用它做点什么。我想说 OP 的代码可以使用任何一种方式提供一些帮助 :)
  • @mgilson 这个解决方案确实对递归有所帮助。解决方案是确保递归函数始终返回。答案中的代码与问题相同。那肯定坏了。不过解决方法没问题,回个东西吧。
  • @DavidHeffernan 基本上我所做的是尝试获取从 0 开始的所有列表的记录,首先获得 100 的人将被返回。 isGoal() 函数检查列表的最后一项是否为 100。anotherList 是从 0 到 100 的随机数的小列表(最多 3 个)。您如何修复我的代码?
  • 我还是不太明白你的函数想要做什么。我想我回答了你实际提出的问题。很抱歉对您没有帮助。
【解决方案2】:

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

所以它的作用是它始终returns 并且是 100% 无限递归证明,因为它有一个有效的基本情况,并且在每个归纳步骤中都有一个递减的长度。

调试递归函数的堆栈查看器

如果我们在基本情况开始时运行recur('big') 并添加assert False,我们将具有以下堆栈结构:

从中我们可以看出,在每一个递归步骤,我们都有val,这是这个函数的唯一参数,越来越小,直到碰到len(val) == 1,然后到达最后的返回,或者在这个案例assert False。所以这只是调试递归函数/方法的一种方便方法。在IDLE 中,您可以通过在shell 中调用Debug > Stack Viewer 来访问这样的视图。

【讨论】:

    猜你喜欢
    • 2019-07-06
    • 2017-10-19
    • 2014-01-24
    • 2018-04-22
    • 2014-04-17
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    相关资源
    最近更新 更多