• 递归函数及尾递归


    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)
    

      

     

  • 相关阅读:
    Firefox功能强大的浏览器 (转)
    常用的dnet开源项目
    15 个 JavaScript Web UI 库
    关于Web路径的备忘
    推荐几个.NET开源图表组件(转)
    C#开源资源大汇总 (转)
    jQuery对select操作小结 转载
    非对称加密RSA的应用及在C#中的实现(转)
    Web开发人员应当知道的15个开源项目
    css中float和列表图片liststyleimage不能正常解析的说明
  • 原文地址:https://www.cnblogs.com/zhoulangshunxinyangfan/p/13367582.html
Copyright © 2020-2023  润新知