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

猜你喜欢

转载自www.cnblogs.com/Kumanon/p/10390710.html