• 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给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/guoxiangqian/p/7684054.html
Copyright © 2020-2023  润新知