需求:计算1*2*3*....*1000的值
常规代码:
def func(arg): res = 1 for i in range(1, arg): res *= i return res
递归方法:
def fun(arg): if arg == 1: return 1 return arg*(fun(arg-1))
- 通过此函数发现,函数最终return的是函数本身的表达式,如果计算5以内的阶乘,他的运行如下:
- fun(5)调用函数fun()函数,此时arg = 5,5>1,所以会return 5 * fun(4)
- fun(4)会调用fun()函数,此时arg=4,4>1,所以会return 4 * fun(3)
- fun(3)会调用fun()函数,此时arg=3,3>1,所以会return 3 * fun(2)
- fun(2)会调用fun()函数,此时arg=2,2>1,所以会return 2 * fun(1)
- fun(1)会调用fun()函数,此时arg=1,1=1,所以会return 1
- 当fun(1)将值返回给fun(2)之后,此时fun(2)=fun(1)*2=2,继续往上返回给fun(3)
- 当fun(2)将值返回给fun(3)之后,此时fun(3)=fun(2)*3=6,继续往上返回给fun(4)
- 当fun(3)将值返回给fun(4)之后,此时fun(4)=fun(3)*4=24,继续往上返回给fun(5)
- 当fun(4)将值返回给fun(5)之后,此时fun(5)=fun(4)*5=120,最终得出结果
- 创建递归的条件
- 一个基线条件:递归终止的条件,需递归开始的时候进行判断处理。
- 一系列的规则:使对递归函数的每次调用都趋进于直至达到这个基线条件
递归可以提高代码的可读性,但是运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。