返回递归函数

时间:2012-07-06 05:11:55

标签: 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)

当我运行它时,我得到:

45
real value 5
this should be real value None

但我期待:

45
real value 5
this should be real value 5

我尝试在return x之外添加if,我获得了默认输入值。任何人都可以解释return的工作原理吗?

3 个答案:

答案 0 :(得分:54)

您调用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将被返回给你的调用者,无论你是否调用该分支中的任何其他函数,无论是什么如果你做了某些事情,那么该函数可能会返回,无论你调用的函数是否与你所在的函数相同。

答案 1 :(得分:18)

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

您需要将其更改为

return test(x-10)

答案 2 :(得分:4)

您忘记在x > 9时返回值。没有返回值,函数将"返回" None