Python-函数的递归调用

一、递归调用解析

1、什么是递归调用

即就是说在调用一个函数的过程中,函数内部又调用另一个函数,而函数的递归调用指的是在调用一个函数的过程中又直接或间接地调用该函数本身。

# 直接
def foo():
    print('hhh')
    foo()
foo()

# 间接
def dar():
    print('hhh')
    foo()

def foo():
    print('哈哈哈')
    dar()

foo()

2、死递归

死递归类似于死循环,调用函数出现的死循环问题。

为什么会死递归:

它是Python的一种保护措施,无限递归会导致内存溢出。

# 了解
import sys  # 导入sys模块
print(sys.getrecursionlimit()) # 查看递归最大层数
print(sys.setrecursionlimit(1000)) # 设置最大层数

所以不应该让它无限进行下去应该满足某个条件结束。

3、递归调用两个阶段

回溯: 一层一层的递归调用下去
递推: 在满足某一条件结束回溯,然后一层一层返回

有趣的小例子帮助理解:
例:有五个同学,第一个同学小明说自己比下一个同学小红大十岁,小红说我比下一个同学大十岁…
最后一位同学说自己18,这时就可以运用递归知识进行推理如下;
def salary(n):
if n == 1:
return 18
return salary(n - 1) + 10

res = salary(5)
print(res)

4、案例

# 算法之二分法
nums = [11, 13, 32, 47, 53, 73, 84, 91]


def foo(l, num):
    m_index = len(l) // 2
    if num > l[m_index]:
        r = l[m_index + 1:]
        foo(r, num)
    elif num < l[m_index]:
        l1=l[:m_index]
        foo(l1,num)
    else:
        print('找到')


foo(nums, 53)

## 从小到大排列的一个数字列表
nums = [11, 13, 32, 47, 53, 73, 84, 91,101,111,222,333,444,5555]


def binary_search(l,find_num):
    print(l)
    if len(l) == 0:
        print('find_num not exists')
        return
    mid_index = len(l) // 2
    if find_num > l[mid_index]:
        right_l=l[mid_index+1:]
        binary_search(right_l,find_num)
    elif find_num < l[mid_index]:
        left_l=l[:mid_index]
        binary_search(left_l,find_num)
    else:
        print('find it')


binary_search(nums,85)

# 取嵌套列表值
nums=[111,[222,[333,[444,[5555,[6666,[777,[888,[9999]]]]]]]]]


def func(l):
    for x in l:
        if type(x) is list:
            # 把自身的代码重新再调用一次
            func(x)
        else:
            print(x)
func(nums)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值