返回递归函数

Ale*_*Key 38 python recursion return

我刚刚开始学习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)
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到:

45
real value 5
this should be real value None
Run Code Online (Sandbox Code Playgroud)

但我预计:

45
real value 5
this should be real value 5
Run Code Online (Sandbox Code Playgroud)

我尝试return x在外面添加if,我得到了默认输入值.任何人都可以解释一下return有效吗?

Ben*_*Ben 61

你调用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
Run Code Online (Sandbox Code Playgroud)

你没有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
Run Code Online (Sandbox Code Playgroud)

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

事实上,递归并不是什么"特殊"的东西; 它的行为与普通函数调用完全相同.您从通过参数调用您的事物中接收信息,并通过返回将信息返回给调用您的事物.如果你没有返回某些东西(可能只在一个臂中if),那么None无论你是否调用该分支中的任何其他函数,都会返回给你的调用者,不管你在调用某些东西时该函数可能会返回什么,无论你调用的函数是否与你所在的函数相同.


Ant*_*ony 20

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

您需要将其更改为

return test(x-10)
Run Code Online (Sandbox Code Playgroud)


nha*_*tdh 5

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