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
  • 相关阅读:
    Redis源代码分析(十三)--- redis-benchmark性能測试
    kvm中运行kvm
    umount.nfs device busy day virsh extend diskSpace, attachDisk
    ultravnc
    openNebula dubug
    maintenance ShellScripts
    virsh VMI deploy data serial xml
    cloud computing platform,virtual authentication encryption
    基于C 的libvirt 接口调用
    storage theory
  • 原文地址:https://www.cnblogs.com/Kumanon/p/10390710.html
Copyright © 2011-2022 走看看