wuqramy 发表于 2020-2-24 09:20:14

python 递归中的坑: return得到None

本帖最后由 wuqramy 于 2020-3-10 16:21 编辑

return的作用是将函数结果返回,即退出def函数模块。大量的教材和网上教程都有说明函数执行遇到return就会结束,返回一个值给调用函数处。常规用法确实是这样,但在递归调用中却存在一个坑,今天就遇到了,举个例子:

一个简单的不断相加的递归小程序:

def add(sum,x,y):
    if sum<10:
      x +=2
      y +=2
      sum=x+y
      add(sum,x,y)
    else:
      sum=x+y
      return sum
print add(0,0,0)
运行程序得到的结果为:

None

结果却是None,让人匪夷所思,更改一下,在return前print打印出返回值:

12
None

经过计算,结果确实应该是12,明明已经计算出了正确的值,为什么函数返回值是None呢。经过多方查阅,发现自己跳坑里去了,惯性思维让我认为return必然会使得def函数模块结束返回一个值,可实际上在递归中并不是,如果改变约束条件在return之后函数还会继续递归计算。

真正的原因是此处的return仅仅是上一次递归调用函数本身时候的返回值,而def函数块并没有返回任何值。也就是说这个return仅属于上一次递归调用,并不属于def函数块。也就是说整个def函数块没有return,也就没有出口,自然不会有数据出去,所以得到None,将程序改变一下:

def add(sum,x,y):

    if sum<10:
      x +=2
      y +=2
      sum=x+y
      sum=add(sum,x,y)
      return sum
    else:
      sum=x+y
      print (sum)
      return sum
print add(0,0,0)
运行结果:

12
12

这次就正确了,程序多次递归后,运行到else,此时返回一个值到达sum=add(sum,x,y)的sum,再return sum,此时为def函数块的返回值。而之前程序运行到sum=add(sum,x,y)时由于等号右边的递归使得程序一直在计算,sum并未被幅值,进而下面的
return sum并未执行,所以只有一个返回值。

zltzlt 发表于 2020-2-24 09:21:54

楼主还在用 Python 2 吗{:10_277:}

wuqramy 发表于 2020-2-24 09:23:12

本帖最后由 wuqramy 于 2020-2-24 09:40 编辑

zltzlt 发表于 2020-2-24 09:21
楼主还在用 Python 2 吗

不,我用Python3{:10_277:}

一个账号 发表于 2020-3-4 10:26:11

wuqramy 发表于 2020-2-24 09:23
不,我用Python3

Python2 语法:

print 123

Python3 语法:

print(123)

wuqramy 发表于 2020-3-4 10:29:05

一个账号 发表于 2020-3-4 10:26
Python2 语法:




{:10_278:}打错了。。。
页: [1]
查看完整版本: python 递归中的坑: return得到None