python 递归,return结果None

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,让人匪夷所思,更改一下,在return前打印出返回值:

经过计算,结果确实应该是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))

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

return sum并未执行,所以只有一个返回值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,786评论 0 2
  • 一、快捷键 ctr+b 执行ctr+/ 单行注释ctr+c ...
    o_8319阅读 11,108评论 2 16
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 9,228评论 0 7
  • 借来的观点和思路,写起来太难,感觉表达也没有逻辑但还是得坚持。 逆代购-重拾国货 相信代购已经是大多数人听说过的词...
    30前立xoxo阅读 2,047评论 0 0
  • 冷静冷静 不要胡言乱语 热闹的房间里 我一个人的孤寂 想出去走走 却漫无目的 在这个快乐的节日里 我一个人的哭泣
    糖汤烫阅读 1,534评论 0 1