python 递归函数

python里面也可以使用递归函数,所谓递归函数就是利用函数本身调用自身,然后一直不停地调用自身,达到合适的条件,然后返回计算后的值。

例如:#计算5的以内的加法

          def add(j):

               if j==0:

                    return 0

              return j+add(j-1)

        print(add(5))

        #15  ,以上过程就是计算0+1+2+3+4+5

在这个过程中,add()函数本身调用了自身的函数return j+add(j-1),这样子一次又一次调用,最后直到 j==0,结束递归。

上面的这个过程就叫做递归。

原理上任何的递归函数都可以当作循环来使用,但是递归函数逻辑比较简明,代码比较简单

但是有的时候递归函数容易出现错误,例如:RecursionError: maximum recursion depth exceeded,这个报错意思是超出最大递归深度,这是因为在计算机里面,函数的调用时通过栈这种数据结构来实现的,每调用一次函数,栈就会增加一层栈帧,每返回一次函数,减少一次栈帧,在计算机里面,栈的空间也是有限的,所以不能无限次调用栈。

我们可以通过使用尾递归优化来解决这个问题,所谓的尾递归优化就是函数的返回值中,不包括表达式,以及算式,只返回调用函数本身,

例如:def a(j):

                if j==0:

                   return 0

               else:

                   return a(j-1)

          print(a(5)) #0

上述程序的结果为0,是一直返回函数的下一个,最后一直到返回0的值,为0,这个例子就是说明可以通过返回函数本身来进行尾递归优化,尾递归优化不论调用多少次都只占用一个栈帧。

但是大多数语言都没有对函数进行尾递归优化,python也没有,可能通过这种方式,函数调用还是会报错。

参考链接:http://www.jb51.net/article/64972.htm

还有一种可以尾递归优化的方式decorator,参考网址:

http://code.activestate.com/recipes/474088-tail-call-optimization-decorator/




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值