递归思路

需求:计算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以内的阶乘,他的运行如下:
  1. fun(5)调用函数fun()函数,此时arg = 5,5>1,所以会return 5 * fun(4)
  2. fun(4)会调用fun()函数,此时arg=4,4>1,所以会return 4 * fun(3)
  3. fun(3)会调用fun()函数,此时arg=3,3>1,所以会return 3 * fun(2)
  4. fun(2)会调用fun()函数,此时arg=2,2>1,所以会return 2 * fun(1)
  5. fun(1)会调用fun()函数,此时arg=1,1=1,所以会return 1
  6. 当fun(1)将值返回给fun(2)之后,此时fun(2)=fun(1)*2=2,继续往上返回给fun(3)
  7. 当fun(2)将值返回给fun(3)之后,此时fun(3)=fun(2)*3=6,继续往上返回给fun(4)
  8. 当fun(3)将值返回给fun(4)之后,此时fun(4)=fun(3)*4=24,继续往上返回给fun(5)
  9. 当fun(4)将值返回给fun(5)之后,此时fun(5)=fun(4)*5=120,最终得出结果
  • 创建递归的条件
  1. 一个基线条件:递归终止的条件,需递归开始的时候进行判断处理。
  2. 一系列的规则:使对递归函数的每次调用都趋进于直至达到这个基线条件

递归可以提高代码的可读性,但是运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

猜你喜欢

转载自www.cnblogs.com/dyuan8888/p/11930080.html