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/