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

    函数递归调用

    在函数内部,可以调用其它函数,如果一个函数在内部调用自身,即是递归调用

    为防止无限递归类似于死循环,需要如下:
      1、必须要有一个明确的返回值;
      2、每次进入更深一层递归时,问题规模应该比上次递归都有所减少;
      3、递归效率不高,当层次过多会导致栈溢出

    例如:

    def calc(n):
        print(n)
        if int(n/2) == 0:
            return n
            
        res=calc(int(n/2))
        return res
        
    v=calc(10)
    print(v)
    返回结果:
    10
    5
    2
    1
    1

    程序执行过程:

      

      调用calc()函数,传入参数10;calc()函数第一次执行;
      进入calc函数,打印10
      判断不满足
      再次调用calc函数传入参数5,calc()函数第二次执行;
      此时第一次calc函数在等待第二次calc函数的返回结果赋值给res

    第二次calc函数执行:

      打印5
      判断不满足
      执行第三次calc函数,传入参数2,calc()函数第三次执行;
      此时第二次calc函数在等待第三次calc函数的返回结果赋值给res

    第三次calc函数执行:

      打印2
      判断不满足
      执行第四次calc函数,传参数1,calc()函数第四次执行;
      此时第三次calc函数在等待第四次calc函数的返回结果赋值给res

    第四次calc函数执行:

      打印1
      判断成立,执行return 1
      第四次calc函数执行完毕,把1返回给第三次calc函数

      第三次calc函数在等待第四次函数的返回结果;

      第四次calc函数返回了1

      第三次calc函数拿到结果后赋值给res;

      第三次calc函数执行return 1返回给第发给次函数
    ************************
      第二次calc函数在等待第三次函数的返回结果;

      第三次calc函数返回了1

      第二次calc函数把1赋值给res

      第二次calc函数执行return 1返回给第一次函数
    ************************
      第一次calc函数在等待第二次函数的返回结果;

      第二次calc函数返回了1

      第一次calc函数把1赋值给rest

      第一次calc函数执行return 1返回给调用它的程序
    ************************

      
    程序接收到了结果1赋值给变量v
    最后打印变量

    #递归实例:问路

    问路最终分为2种情况:
      - 问到最后没人知道;

      - 问到某个人时知道;

      - 现在假设有个人物列表代表问路时需要问的人

      - 假设问到最后Tom知道路

    person_list=["zhangsan","lisi","Tom"] #路人列表,需要被问到的人
    def find_way():
        if len(person_list) == 0:
            return "No one know the way"  #问到最后没人知道
    
        person=person_list.pop(0)    #依次弹出1个人去问
    
        if person == "Tom":        #只有Tom才知道,弹出的人不是Tom,表示不知道,需要问下一个人
            return "%s said:I know the way,over there" %person
        res=find_way()
        return res
    
    v=find_way()
    print(v)
    返回结果:
    Tom said:I know the way,over there
  • 相关阅读:
    Notepad++64插件安装方法
    lucene、solr、nutch三者的关系
    更改MySQL数据库的编码为utf8mb4
    对request.getSession(false)的理解(附程序员常疏忽的一个漏洞)
    登录页面的表单验证(登录+密码 )
    MSYS2 环境搭建,并整合Qt
    QAbstractItemView为截断的项显示ToolTip(使用事件过滤)
    TraceTool 跟踪工具的瑞士军刀(C++版使用)
    Indy9的TIdFTPServer封装类
    Delphi 7学习开发控件(继承TGraphicControl只画一条线)
  • 原文地址:https://www.cnblogs.com/Kumanon/p/10390710.html
Copyright © 2011-2022 走看看