zoukankan      html  css  js  c++  java
  • 递归函数

    递归的定义

    什么是递归:函数递归是指“直接调用或间接调用”函数本身

    直接调用:指的是在函数内置,直接调用函数本身

    间接调用:两个函数之间相互调用间接造成递归

    代码特点:

    1 函数内部的代码是相同的,只是针对参数不同,处理的结果不同

    2 当参数满足一个条件是,函数不在执行

    这个通常被称为递归的出口,否则会出现死循环

    • 这是一种函数嵌套调用的表现形式
    • 最大递归层数限制:998,
    获取递归深度: 了解
                sys.getrecursionlimit()
    
    设置递归深度: 了解
                sys.setrecursionlimit(深度值)
    

    下面是一个递归函数的实例:

    def calc(n):
    
        print(n)
    
        if int(n/2) > 0:  # 回溯,每一次执行都要拿到一个更接近于结果的结果
            calc(int(n/2))
        else:
            print('------')
    
        print(n)  # 当回溯找到一个终止条件后,开始一步一步往上递推
    calc(10)
    
    打印结果:
    10
    5
    2
    1
    ------
    1
    2
    5
    10
    

    递归分解

    def calc(10):
        print(10)
        if int(10/2) > 0:
        
            def calc(5):
                print(5)
                if int(5/2) > 0:
    
                    def calc(2):
                        print(2)
                        if int(2/2) > 0:
    
                            def calc(1):
                                print(1)
                                print('------')
                                print(1)
                        print(2)
                print(5)
        print(10)
    

    最大递归

    def foo(n):
        print(n)
        n += 1
        foo(n)
    foo(1)
    

    遵循两个条件

    想要递归有意义,必须遵循两个条件:

    • 回溯:
      指的是重复地执行, 每一次执行都要拿到一个更接近于结果的结果,
      回溯必要有一个终止条件。

    • 递推:
      当回溯找到一个终止条件后,开始一步一步往上递推。

    练习

    利用递归函数打印出列表中的每一个元素,l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]]

    l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]
    
    def get_all(l):
        for item in l:
            if isinstance(item, (tuple, list, dict, set)) == True:
                get_all(item)
            else:
                print(item)
    get_all(l)
    
    # 循环取出第一个元素,判断是否是元组列表等
    # 如果 1 不是,else 打印出来
    # 此时 循环的结果是 [2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]
    # 是一个列表,将递归调用 get_all 函数,取出2 打印出来
    

    小结

    使用递归函数的优点是 逻辑简单清晰,缺点是过深的调用会 导致栈溢出

  • 相关阅读:
    Bootstrap导航组件
    Bootstrap输入框组
    Bootstrap按钮式下拉菜单
    Bootstrap按钮组
    Bootstrap下拉菜单
    Bootstrap 中的 aria-label 和 aria-labelledby
    js 在函数中遇到的this指向问题
    js中 clientWidth offsetWidth scrollWidth等区别
    小程序--授权封装
    小程序--分享功能
  • 原文地址:https://www.cnblogs.com/kai-/p/11868179.html
Copyright © 2011-2022 走看看