递归函数及尾递归

1、递归函数

"""
自己调用自己的函数,一去一回就是递归函数
"""
​
# 示例一
def digui(n):
    print(n,"<====1===>")
    if n > 0:   
        digui(n-1)
    print(n,"<====2===>")
digui(5)
​
# 示例二 (阶乘)
num = 1
def func(n):
    global num
    if n >0 :
        func(n-1)
        num *= n
    return num
res = func(5)
print(res)
​
# 示例三 (阶乘改进版)
def jiecheng(n):
    if n <= 1:
        return 1
    return n*jiecheng(n-1)
res = jiecheng(5)
print(res)
​
# 总结(每次调用函数时,在内存中都会单独开辟一个空间,配合函数运行,这个空间叫做栈帧空间)
"""
(1).递归是一去一回的过程,
    调用函数时,会开辟栈帧空间,函数执行结束之后,会释放栈帧空间
    递归实际上就是不停的开辟和释放栈帧空间的过程
    每次开辟栈帧空间,都是独立的一份,其中的资源不共享
(2).触发回的过程
    1.当最后一层栈帧空间全部执行结束的时候,会触底反弹,回到上一层空间的调用处
    2.遇到return,会触底反弹,回到上一层空间的调用处,
    
(3).写递归时,必须给与递归跳出的条件,否则会发生内存溢出,蓝屏死机的情况.
    如果递归层数过多,不推荐使用递归
"""

  

2、尾递归

"""
自己调用自己,并且非表达式
计算的结果要在参数当中完成.
​
尾递归无论调用多少次函数,都只占用一份空间,但是目前cpython不支持.
"""
# 示例一(阶乘)
def jiecheng(n,endval):
    if n <= 1:
        return endval
    return jiecheng(n-1,endval*n)
​
res = jiecheng(5,1)
print(res)
"""
return 后面的表达式,一定是先计算完在返回
# 代码解析:
# 去的过程:
n = 5   return 5*jiecheng(5-1) => 5 * jiecheng(4)
n = 4   return 4*jiecheng(4-1) => 4 * jiecheng(3)
n = 3   return 3*jiecheng(3-1) => 3 * jiecheng(2)
n = 2   return 2*jiecheng(2-1) => 2 * jiecheng(1)
n = 1   return 1
​
# 回的过程:
n = 2   return 2*jiecheng(2-1) => 2 * jiecheng(1) => 2 * 1
n = 3   return 3*jiecheng(3-1) => 3 * jiecheng(2) => 3 * 2 * 1
n = 4   return 4*jiecheng(4-1) => 4 * jiecheng(3) => 4 * 3 * 2 * 1
n = 5   return 5*jiecheng(5-1) => 5 * jiecheng(4) => 5 * 4 * 3 * 2 * 1
return 5 * 4 * 3 * 2 * 1 => return 120
"""
​
# 示例二 (斐波那契数列)
def Fbo(n):
    if n <= 2:
        return 1
    return Fbo(n-1) + Fbo(n-2)
res = Fbo(6)
print(res)

  

 

原文地址:https://www.cnblogs.com/zhoulangshunxinyangfan/p/13367582.html