ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • Python笔记

    • 基础知识

      • 常见规范与运行方式
      • 变量与垃圾回收机制
      • 输入与格式化输出
      • 运算符
      • 流程控制语句
      • 浅拷贝和深拷贝
      • 常用数据类型与分类
      • 数据类型方法
      • 字符编码
      • 文件操作
      • 函数与参数
      • 命名空间与作用域
      • 闭包函数与装饰器
      • 迭代器与生成器
      • 三元表达式与生成式
      • 函数递归
        • 函数递归介绍
        • 二分法
          • 作用
          • 实现
      • 面向过程式和函数式编程
      • 模块与包
      • 程序设计目录参考
      • 常用内置模块或函数
      • 序列化和猴子补丁
      • 日志模块-logging
    • 类与面向对象

    • 并发编程

    • Web编程

    • 模块笔记

    • 其他

  • C笔记

  • C++笔记

  • Arduino笔记

  • Dev
  • Python笔记
  • 基础知识
Hoshinozora
2023-02-15
目录

函数递归

# 函数递归介绍

函数的递归调用,是函数嵌套调用的一种特殊形式。在调用一个函数的过程中,直接或者间接的调用到函数本身。

递归的本质就是循环,但不应让递归死循环,必须在满足某种条件时,结束递归调用。

递归的回溯,即一层一层的调用下去。

递归的递推,即在某一层满足结束条件,结束递归调用后,就会开始递推,也就是一层一层的返回结果的过程。

def f1(n):
    if n == 10:
        return
    print(n)
    n+=1
    f1(n)
f1(0)
1
2
3
4
5
6
7

# 二分法

# 作用

假如需要从一个按大小排序的列表中找到一个值,如果通过遍历的方式去查找,则在列表很长、同时要查找的值在最后面的情况下,需要把列表元素全部遍历一遍,造成了效率低下的问题。

而如果使用二分法,即便列表再长,也不会查找的太多次,因为二分法的每一次查找,都能直接排除掉一半,所以这是一种较为高效的查找方式。

# 实现

需要借用到函数递归实现自身调用自身,同时列表需要有序。

函数中先的出中间索引,然后通过该索引对应的值,判断与要查找的值的大小关系。

如果索引的值大于要找的值,则将列表前半部分进行切片,然后将其作为参数调用自身查找这一半。

反之小于则是找后半部分,同时判断如果索引对应的值等于要找的值,那就是找到了。

循环反复最终就将值找出来,但如果没有找到可能会抛出异常或死循环,所以应该在函数开头判断如果列表为空,则输出提示然后直接返回,不再继续执行。

# 二位列表存储数据
lst = [(i, f"iamdata-{i}") for i in range(0, 10000)]

# 二分法查找数据函数
def findata(lst, key):
    # 如果为递归到lst一个值都不剩,说明列表中没有要找的值。
    if len(lst) == 0:
        print('Found failed')
        return

    # 取中间索引
    mid_index = len(lst) // 2
    # 取中间值
    mid_value = lst[mid_index][0]
    # 如果有序列表的中间值大于key,说明要找的数据在前半段。
    if mid_value > key:
        # 查找前半段数据,,由于索引切片不包含结束索引的值,所以直接使用中间索引即可。
        return findata(lst[:mid_index], key)
    # 如果有序列表的中间值小于key,说明要找的数据在后半段。
    elif mid_value < key:
        # 查找后半段数据,由于索引切片会包含起始索引的值,所以要+1以排除这个已经判断过的中间值。
        return findata(lst[mid_index + 1:], key)
    # 如果等于则说明找到了,返回查找的数据。
    else:
        print(f"Index: {lst[mid_index][0]}, Find Data: {lst[mid_index][1]}")
        return

# 调用查找函数
findata(lst, 123)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#函数递归#二分法
三元表达式与生成式
面向过程式和函数式编程

← 三元表达式与生成式 面向过程式和函数式编程→

最近更新
01
二〇二五年四月十七日随笔
04-17
02
二〇二五年四月十六日随笔
04-16
03
二〇二五年四月九日随笔
04-09
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式