函数的递归调用

一:引入

函数的递归调用:就是在调用一个函数的过程中又直接或间接地调用了自己
示例1:直接调用自己

def foo():
    print('hello')
    foo()
foo()

示例2:间接的调用自己

def foo():
    print('from foo')
    bar()

def bar():
    print('from bar')
    foo()

bar()

为何死递归会抛出异常?
因为无限的递归会导致内存的溢出,所以python设定了最大的递归层数

import sys
print(sys.getrecursionlimit()) #默认1000层
print(sys.getrecursionlimit(2000)) #可以进行更改

所以:不应该无限递归调用下去,应该在满足某种条件下结束递归调用,然后返回

二:递归调用应该分为两个阶段

1.回溯(挖井) :一层一层地递归调用下去
2.递推(从井里往外爬) :在满足某一条件的情况下结束回溯,然后开始向上一层层返回
示范一:

salary(5)=salary(4)+10
salary(4)=salary(3)+10
salary(3)=salary(2)+10
salary(2)=salary(1)+10
salary(1)=18

n=1   salary(n) = 18
n!=1  salary(n) = salary(n-1) + 10

def saraly(n):
    if n==1:
        return 18
    return saraly(n-1)+10
print(saraly(5))

示范二:

nums=[111,[222,[333,[444,[5555,[6666,[777,[888,[9999]]]]]]]]]
def func(num):
    for i in num:
        if type(i) is list:
            func(i)
        else:
            print(i)
func(nums)

从小到大排列的一个数字列表(二分法)

nums = [11, 13, 32, 47, 53, 73, 84, 91, 101, 111, 222, 333, 444, 5555]

def func(num,lis):
    if len(lis)==0:
        print('没找到')
        return
    print(lis)
    res=len(lis) // 2
    mid_num = lis[res]
    if num>mid_num:
        right_l=lis[res+1:] 切分
        func(num,right_l)
    elif num<mid_num:
            left_l=lis[ :res]
            func(num,left_l)
    else:
        print('找到了')
func(0,nums) #没找到,最后会二分出一个空括号,由此判断找不到
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值