为了账号安全,请及时绑定邮箱和手机立即绑定

递归函数返回

递归函数返回

慕码人2483693 2019-11-03 04:04:36
我刚刚开始学习python(v3.2.3),并return在此函数中遇到了一个奇怪的问题:def test(x):    if x > 9 :        test(x - 10)    else:        print('real value',x)        return xx = int(input())y = test(x)print('this should be real value',y)当我运行它时,我得到:45real value 5this should be real value None但我期望:45real value 5this should be real value 5我尝试return x在外部添加,if得到默认输入值。谁能解释一下如何return工作?
查看完整描述

3 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

您调用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 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无论您是否在该分支中调用任何其他函数,无论该函数可能会返回什么内容,都会将其返回给调用者,并且无论您调用的函数是否恰好与您所在的函数相同。



查看完整回答
反对 回复 2019-11-04
?
HUWWW

TA贡献1874条经验 获得超12个赞

返回是缩进的,因此它仅在else分支中执行。如果采用第一个分支,则该函数隐式返回None。


您需要将其更改为


return test(x-10)


查看完整回答
反对 回复 2019-11-04
?
隔江千里

TA贡献1906条经验 获得超10个赞

您忘了在返回值x > 9。没有返回值,该函数将“返回” None

查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 367 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信