• Python-函数递归


    一、首先了解下,函数的嵌套调用

    def func1():
        print('from func1')
        func1()
    
    func1()

    此例子,递归调用没有结束条件,进入死循环。但python对它做了层级限制,不会进入死循环,避免内存溢出。

    函数递归调用:在调用一个函数的过程中直接或间接地调用该函数本身,称之为函数的递归调用。

    n=1
    def func1():
        global n
        print('from func1',n)
        n+=1
        func1()
    
    func1()

    此例子可以看执行了多少次!

    import sys
    print(sys.getrecursionlimit())

    python本身的层级限制(默认1000),这个值可以修改

    import sys
    print(sys.getrecursionlimit())
    sys.setrecursionlimit(2000)
    
    n=1
    def func1():
        global n
        print('from func1',n)
        n+=1
        func1()
    
    func1()

    继续下面例子:

    def func():
        print('from func')
        bar()
    
    def bar():
        func()
    
    func()

    ==

    def func():
        print('from func')
        func()
    
    func()

    二、递归定义

    递归分为两个重要的阶段:递推+回溯

    设计思路:
    age(5)=age(4)+2
    age(4)=age(3)+2
    age(3)=age(2)+2
    age(2)=age(1)+2
    age(1)=18
    
    n!=1 #age(n)=age(n-1)+2
    n=1 #age(n)=18
    def age(n):
        if n == 1:
            res=18
            return res
        res=age(n-1)+2 #res=age(4)+2:age5等这一步的结果
        return res
    
    print(age(5))

    return 的作用是:返回值,结束当前调用。

    进入下一次递归前,保存上一次递归结果,所以递归的效率不高!

    总结递归调用:
    1:进入下一次递归时,问题的规模必须降低
    2:递归调用必须要有一个明确的结束条件
    3:在python中没有尾递归优化,递归调用的效率就是不高

    实战一、

    def bar():
        import time
        time.sleep(3)
        return 4
    
    def foo():
        res=bar()+3
        return res
    
    print(foo())
    
    这里也可以写成:
    def foo():
        return bar()+3
    
    先执行retrun后面代码,再返回值!

    实战二:

    l=[1,2,[3,[4,[5,[6,7,[8,9,[10,[11,[12]]]]]]]]]
    def get(l):
        for item in l:
            if isinstance(item,list):
                get(item)
            else:
                print(item)
    
    get(l)
    也可以写成:
    
    if type(item) is list:

    1、满足条件结束递归;

    2、满足条件进入下一次递归。

    作者:大雄猫
    出处:http://www.cnblogs.com/guoxiangqian/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面 明显位M给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    vue 循环Redio
    vue 子组件修改父组件变量问题
    docker安装redis
    vue 复制内容到粘贴板
    vue 组件传值
    vscode 打开多个标签页
    asp.net 文件分片上传
    css之图片下方定位遮掩层
    Python发送邮件脚本
    git添加秘钥提示Key is already in use
  • 原文地址:https://www.cnblogs.com/guoxiangqian/p/7684054.html
Copyright © 2020-2023  润新知