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

    Python:函数递归

    定义:在调用一个函数的过程中直接或间接的调用该函数本身,称之为递归调用。递归调用最多能调用999层。

    基础模型:  

    def func():
        print('from func')
        func()    #直接调用自身
        
    func():
    def func():
        print('from func')
        bar()    #间接调用自身
    
    def bar():
        print("from bar")
        func()
    
    func()

    虽然以上两中方式为函数递归的基础模型,但往往不能直接这样使用。因为没有一个函数的结束条件,仅仅相当于一个死循环。

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

      递推:函数不断减少问题规模直至最终的终止条件。

      回溯:拿到最终明确的值后,返回给上次调用进行处理,直至初始层。

     练习题:解决年龄问题,求出alex的年龄

    """
    alex 他比佩奇 大两岁。  4   age(3) + 2
    佩奇 他比日天 大两岁。  3   age(2) + 2
    日天 他比太白 大两岁。  2   age(1)  + 2
    太白:我今年23.         1   23
    """
    
    def age(n):
        if n == 1:
            return 23
        else:
            return age(n-1) + 2
    
    print(age(4))      #这里的4表示解决问题的规模

    29

    流程分析:

    """
    def age(4):
        if n == 1:
            return 23
        else:
            return age(3) + 2   23 + 2 + 2 + 2
    
    def age(3):
        if n == 1:
            return 23
        else:
            return age(2) + 2   23 + 2 + 2
             
    def age(2):
        if n == 1:
            return 23
        else:
            return age(1) + 2    23 + 2
            
    def age(1):
        if n == 1:
            return 23
        else:
            return age(0) + 2
    
    """

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

     简单应用场景:

    取出列表  l=[1,2,[3,[4,[5,[6,[7,[8,9,[10]]]]]]]] 中的所有元素

    def get(l):
        for item in l:
            if isinstance(item, list):
                get(item)     #如果元素为一个列表,那么递归调用自己把该列表传给get()函数,进行递归调用
            else:
                print(item)
    get(l)
  • 相关阅读:
    linq的多表查询
    markdown语法
    遍历Hashtable、IDictionary、Dictionary<string, string>
    DOS修改文件夹权限
    kangle 3.2.0 发布,国产开源web服务器
    nat上传文件到google
    黄聪:C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件,有图解
    UltiDev Web Server Pro
    vs2010 命令行下用 msbuild 发布web站点
    asp.net重启网站
  • 原文地址:https://www.cnblogs.com/bailo/p/9162270.html
Copyright © 2011-2022 走看看