【问题标题】:Return in Recursive Function递归函数中的返回
【发布时间】:2012-07-06 05:11:55
【问题描述】:

我刚开始学习python(v3.2.3),遇到了一个关于这个函数中return的奇怪问题:

def test(x):
    if x > 9 :
        test(x - 10)
    else:
        print('real value',x)
        return x

x = int(input())
y = test(x)
print('this should be real value',y)

当我运行它时,我得到:

45
real value 5
this should be real value None

但我期待:

45
real value 5
this should be real value 5

我尝试在if 之外添加return x,我得到了默认输入值。谁能解释一下return 的工作原理?

【问题讨论】:

  • 这和非递归调用完全一样:如果你想从你调用的函数传播返回值,你必须自己做,使用return关键字。调用一个函数会产生它的返回值,但无论被调用的函数是否是递归的,都由你来处理这个返回值。
  • 这能回答你的问题吗? Why does my recursive function return None?

标签: python recursion return


【解决方案1】:

您调用test(45)。这将测试45 > 9 是否为真,因此它调用test(35) (45 - 10),而不返回其结果。同样的事情发生在test(25)test(15) 上,直到最后test(5) 被调用。

这会打印“真实值 5”,然后返回 5。但是从函数返回结果总是会将其返回给该函数的直接调用者。它不会通过几次调用立即跳出;毕竟,调用者可能想在返回某些东西给它的调用者之前对返回的结果做一些事情。但在这种情况下,只有 test(5) 会返回任何东西;所有其他人都调用test(x - 10),等待它返回,忽略它返回的任何内容,然后(隐式)返回None。由于最外层的调用test(45) 是其中一种情况,所以你得到的是None

以下是对所发生情况的可视化尝试:

test(45):
| test(35):
| | test(25):
| | | test(15):
| | | | test(5):
| | | | | print('real value',5)
| | | | | return 5 to test(15)
| | | | return None to test(25)
| | | return None to test(35)
| | return None to test(45)
| return None

您没有在解释器中调用test(5)test(5) 是从另一个函数调用内部调用的。因此,test(5) 的返回将转到 该函数调用。这是一个调用自身的函数这一事实完全不相关。如果您的代码如下所示,您将得到完全相同的结果:

def test45(x):
    if x > 9 :
        test35(x - 10)
    else:
        print('real value',x)
        return x

def test35(x):
    if x > 9 :
        test25(x - 10)
    else:
        print('real value',x)
        return x

def test25(x):
    if x > 9 :
        test15(x - 10)
    else:
        print('real value',x)
        return x

def test15(x):
    if x > 9 :
        test5(x - 10)
    else:
        print('real value',x)
        return x

def test5(x):
    if x > 9 :
        print 'No more tests :('
    else:
        print('real value',x)
        return x

您使用 'x=45' 调用的 test(x) 函数与调用 test45(45) 相同。我希望您能明白为什么在不涉及递归 时应该返回None 是显而易见的。好吧,当涉及递归时,什么都没有改变。 return 语句既不知道也不关心它是否从递归调用的函数返回,它在任何一种情况下的行为方式完全相同。

事实上,递归根本不是什么“特殊”的东西。它的行为方式与普通函数调用完全相同。您通过参数从调用您的事物接收信息,并通过返回将信息返回给调用您的事物。如果您不返回某些东西(可能只在if 的一个手臂中),那么None 将返回给您的调用者,无论您是否调用该分支中的任何其他函数,无论该函数可能返回什么如果您确实调用了某些东西,并且无论您调用的函数是否恰好是您所在的函数。

【讨论】:

    【解决方案2】:

    return 是缩进的,所以它只在 else 分支中执行。如果采用第一个分支,则函数隐式返回 None。

    您需要将其更改为

    return test(x-10)
    

    【讨论】:

    • 所以这是否意味着即使在错误的未执行条件下我也需要返回?
    • @AlexKey:是的。因为y 仅被分配了第一个函数调用的值。这不是 Python 独有的东西。 Python 唯一的独特之处在于,当没有 return 语句时,函数会隐式返回 None
    【解决方案3】:

    x > 9 时忘记返回值。没有返回值,函数将“返回”None

    【讨论】:

    • 所以总而言之,我需要在这两个条件下都返回是吗?
    • @AlexKey:在上面的代码中,是的,你会返回评估test(x - 10)的值
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 2017-10-29
    • 2011-05-23
    • 2022-11-05
    • 2013-09-21
    相关资源
    最近更新 更多