递归函数返回

我刚刚开始学习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

我尝试return x在外部添加,if得到默认输入值。谁能解释一下如何return工作?


慕码人2483693
浏览 368回答 3
3回答

精慕HU

您调用test(45)。这会测试,是否45 > 9为true,因此它将调用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 xdef test35(x):    if x > 9 :        test25(x - 10)    else:        print('real value',x)        return xdef test25(x):    if x > 9 :        test15(x - 10)    else:        print('real value',x)        return xdef test15(x):    if x > 9 :        test5(x - 10)    else:        print('real value',x)        return xdef 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无论您是否在该分支中调用任何其他函数,无论该函数可能会返回什么内容,都会将其返回给调用者,并且无论您调用的函数是否恰好与您所在的函数相同。

HUWWW

返回是缩进的,因此它仅在else分支中执行。如果采用第一个分支,则该函数隐式返回None。您需要将其更改为return test(x-10)

隔江千里

您忘了在返回值x > 9。没有返回值,该函数将“返回” None。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python