python递归函数代码_Python递归函数 二分查找算法实现解析

2023-11-18

一、初始递归

递归函数:在一个函数里在调用这个函数本身。

递归的最大深度:998

正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997(只要997!你买不了吃亏,买不了上当...).

拿什么来证明这个“998理论”呢?这里我们可以做一个实验:

def foo(n):

print(n)

n += 1

foo(n)

foo(1)

由此我们可以看出,未报错之前能看到的最大数字就是998.当然了,997是python为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它:

import sys

print(sys.setrecursionlimit(100000))

我们可以通过这种方式来修改递归的最大深度,刚刚我们将python允许的递归深度设置为了10w,至于实际可以达到的深度就取决于计算机的性能了。不过我们还是不推荐修改这个默认的递归深度,因为如果用997层递归都没有解决的问题要么是不适合使用递归来解决要么是你代码写的太烂了~~~

看到这里,你可能会觉得递归也并不是多么好的东西,不如while True好用呢!然而,江湖上流传这这样一句话叫做:人理解循环,神理解递归。所以你可别小看了递归函数,很多人被拦在大神的门槛外这么多年,就是因为没能领悟递归的真谛。而且之后我们学习的很多算法都会和递归有关系。来吧,只有学会了才有资本嫌弃!

二、递归示例讲解

这里我们又要举个例子来说明递归能做的事情。

例一:

现在你们问我,alex老师多大了?我说我不告诉你,但alex比 egon 大两岁。

你想知道alex多大,你是不是还得去问egon?egon说,我也不告诉你,但我比武sir大两岁。

你又问武sir,武sir也不告诉你,他说他比太白大两岁。

那你问太白,太白告诉你,他18了。

这个时候你是不是就知道了?alex多大?

1

金鑫

18

2

武sir

20

3

egon

22

4

alex

24

你为什么能知道的?

首先,你是不是问alex的年龄,结果又找到egon、武sir、太白,你挨个儿问过去,一直到拿到一个确切的答案,然后顺着这条线再找回来,才得到最终alex的年龄。这个过程已经非常接近递归的思想。我们就来具体的我分析一下,这几个人之间的规律。

age(4) = age(3) + 2

age(3) = age(2) + 2

age(2) = age(1) + 2

age(1) = 40

那这样的情况,我们的函数怎么写呢?

def age(n):

if n == 1:

return 40

else:

return age(n-1)+2

print(age(4))

如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做?

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

你说,so easy!

l.index(66)...

我们之所以用index方法可以找到,是因为python帮我们实现了查找方法。如果,index方法不给你用了。。。你还能找到这个66么?

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

i = 0

for num in l:

if num == 66:

print(i)

i+=1

上面这个方法就实现了从一个列表中找到66所在的位置了。

但我们现在是怎么找到这个数的呀?是不是循环这个列表,一个一个的找的呀?假如我们这个列表特别长,里面好好几十万个数,那我们找一个数如果运气不好的话是不是要对比十几万次?这样效率太低了,我们得想一个新办法。

二分查找算法

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

你观察这个列表,这是不是一个从小到大排序的有序列表呀?

如果这样,假如我要找的数比列表中间的数还大,是不是我直接在列表的后半边找就行了?

2019812161800564.png?2019712161825

这就是二分查找算法!

那么落实到代码上我们应该怎么实现呢?

简单版二分法

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

def func(l,aim):

mid = (len(l)-1)//2

if l:

if aim > l[mid]:

func(l[mid+1:],aim)

elif aim < l[mid]:

func(l[:mid],aim)

elif aim == l[mid]:

print("bingo",mid)

else:

print('找不到')

func(l,66)

func(l,6)

升级版二分法

l1 = [1, 2, 4, 5, 7, 9]

def two_search(l,aim,start=0,end=None):

end = len(l)-1 if end is None else end

mid_index = (end - start) // 2 + start

if end >= start:

if aim > l[mid_index]:

return two_search(l,aim,start=mid_index+1,end=end)

elif aim < l[mid_index]:

return two_search(l,aim,start=start,end=mid_index-1)

elif aim == l[mid_index]:

return mid_index

else:

return '没有此值'

else:

return '没有此值'

print(two_search(l1,9))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: Python递归函数 二分查找算法实现解析

本文地址: http://www.cppcns.com/jiaoben/python/268203.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python递归函数代码_Python递归函数 二分查找算法实现解析 的相关文章

  • Linux 数据库备份与恢复

    1 备份数据主要使用dump命令 格式为 mysqldump u db user p db passwd db name gt backup dir db name time sql p 和 db passwd之间没有空格 不然 db pa
  • 加解密和签名验签简述

    文章目录 一 数字加密算法 1 对称加密 2 非对称加密 3 对称加密和非对称加密的区别 二 使用keytool生成证书 1 创建证书 2 查看密钥库 2 1 keytool list 命令 2 2 keytool list v 命令 3
  • Transformer:Attention is All You Need

    Transformer论文逐段精读 论文精读 https www bilibili com video BV1pu411o7BE share source copy web vd source 30e93e9c70e5a43ae75d429
  • 分析 ExitCode 定位 Pod 异常退出原因

    使用kubectl describe pod
  • vue 表单校验不通过时拦截提交表单

    上代码
  • JSP 弹出框 子页面给父页面回传参数

    做一个jsp的页面 然后又弹出一个对话框 并且把输入框的值返回到文本中 具体代码如下 1 父页面 写道
  • 引入纯 ESM 模块化的第三方包

    CSDN中文章不一定能及时更新 欢迎点击前往我的博客查看最新版本 许盛的博客 背景 今天要做个 CLI 工具 一路调研学习加实践都比较顺利 但是在引入 globby 这个库时 就开始报错了 Users xusheng workspace t
  • 2023华为OD机试真题【二元组个数/哈希表】

    题目描述 给定两个数组a b 若a i b j 则称 i j 为一个二元组 求在给定的两个数组中 二元组的个数 输入描述 第一行输入 m 第二行输入m个数 表示第一个数组 第三行输入 n 第四行输入n个数 表示第二个数组 输出描述 二元组个
  • mysql cstmt_MySQL

    创建一个以JDBC连接数据库的程序 包含7个步骤 1 加载JDBC驱动程序 在连接数据库之前 首先要加载想要连接的数据库的驱动到JVM Java虚拟机 这通过java lang Class类的静态方法forName String class
  • 《上海市居住证》签注和积分确认流程指南

    上海市居住证 签注和积分确认流程指南 一 办理条件 员工已经自行至社区事务受理服务中心办理 上海市居住证 签注 由于上海市居住地所属的社区事务中心非常多 具体申请相关流程指南及材料办理清单最好事先和居住地所属的社区事务中心确认 办理 上海市
  • SSL_CTX结构体

    定义在ssl h头文件中 struct ssl ctx st SSL METHOD method unsigned long options unsigned long mode STACK OF SSL CIPHER cipher lis
  • E-R图(Entity Relationship Diagram)实体关系模型

    E R图也称实体 联系图 Entity Relationship Diagram实体关系模型 提供了表示实体类型 属性和联系的方法 用来描述现实世界的概念模型 它是描述现实世界关系概念模型的有效方法 是表示概念关系模型的一种方式 用 矩形框
  • 为什么要用缓冲流

    一开始学习处理流会疑问为什么速度会加快呢 好比一个10KB的文件 使用最基本的字节流读写 只要读一次10KB到内存 存一次10KB到目标文件就行了 但是使用缓冲不是要读1次10KB到缓冲 再从缓冲写一次10KB到CPU 再从CPU写10KB
  • No matching distribution found for tensorflow 解决方法

    2020 8最新版本为TF2 3 安装时容易出现的问题是各软件程序版本不统一的问题 GPU版本对应表如下图所示 图片来源于Tensorflow 官网 分割线 分割线
  • 使用JavaScript编写HTML

    使用JavaScript编写HTML 1 什么是JavaScript JavaScript是一种脚本语言 通过Dom定义表示和修改文档所需的对象和这些对象的行为和属性以及这些对象之间的关系从而操作HTML文档 比如添加 移除 改变或重排页面
  • ARM之未定义指令异常和SVC异常

    异常向量表的概述 在上一章 我们学习了建立异常向量表 这里我们可以通过看arm的手册 我们每一种异常都对应一个工作模式 下面我就来尝试触发一下未定义指令异常和SVC异常 异常发生的说明 简单的来说就是先保存现场 之后恢复现场 保存现场 我们
  • 第一章 计算机系统概论

    一 计算机系统简介 1 计算机软硬件概念 计算机是一种能够执行指令的电子设备 它由硬件和软件两部分组成 计算机硬件是指计算机系统中的物理组件 包括中央处理器 CPU 内存 硬盘 输入设备 如键盘 鼠标 输出设备 如显示器 打印机 等 这些硬
  • windows10安装RDKit化学信息学python库(通过anaconda)

    RDKit是一款功能强大的化学信息学工具 推荐使用anaconda安装 安装时应当参考 1 官方安装指南 Rdkit Anaconda org 2 中文教程 RDKit简介 RDKit 中文教程 2020 09 文档 chenzhaoqia
  • python爬虫之数据解析

    python爬虫之数据解析 正则表达式 bs4 xpath 主要运用在聚焦爬虫模块中 涉及到的数据解析方法有 正则表达式 bs4以及xpath 1 使用对象 聚焦爬虫 聚焦爬虫 爬取页面中指定的页面内容 2 数据解析原理概述 解析的局部的文

随机推荐

  • word在另外计算机格式不对,为什么word 2007文件在不同电脑上排版显示不同?应该如何解决?...

    为什么word文件在不同电脑排版显示不同 最近打印论文 自己的笔记本是word2007 保存的通用格式 预览排版没有问题 去打印店打印时 发现插入的图片窜行了 幸亏即使调整过来 并且保存 但拿回自己的笔记本打开后图片的位置还是窜行的 请问这
  • iOS中堆和栈的使用(Swift)

    堆和栈都是一种数据项按序排列的数据结构 只能在一端 称为栈顶 top 对数据项进行插入和删除 堆 队列优先 先进先出 FIFO first in first out 栈 先进后出 FILO First In Last Out 堆栈空间分配
  • 手机APP远程温湿度监控系统(连上公网、阿里云)

    APP界面 实物图 操作演示 一 硬件电路图 这里有两点需要说明 1 第一点是关于LCD1602需不需要加上拉电阻的说明 51单片机P0口作为IO口输出时 输出低电平为0 输出高电平为高组态 并非5V 相当于悬空状态 也就是说P0 口不能真
  • 【蓝桥杯Python组】寻找2020

    寻找2020 题目描述 小蓝有一个数字矩阵 里面只包含数字 0 和 2 小蓝很喜欢 2020 他想找到这个数字矩阵中有多少个 2020 小蓝只关注三种构成 2020 的方式 同一行里面连续四个字符从左到右构成 2020 同一列里面连续四个字
  • matlab中 hold on 与 hold off,figure作用

    hold on是当前轴及图像保持而不被刷新 准备接受此后将绘制的图形 多图共存 即启动图形保持功能 当前坐标轴和图形都将保持 从此绘制的图形都将添加在这个图形的基础上 并自动调整坐标轴的范围 hold off使当前轴及图像不再具备被刷新的性
  • moviepy音视频剪辑:视频剪辑基类VideoClip详解

    前往老猿Python博文目录 一 概述 在 moviepy音视频剪辑 moviepy中的剪辑基类Clip详解 和 moviepy音视频剪辑 moviepy中的剪辑基类Clip的属性和方法详解 介绍了剪辑相关类及类关系 可以看到视频剪辑类Vi
  • 汽车电子行业静态分析和代码审查规则

    汽车电子行业静态分析和代码审查规则 查了很多编码规则大都是PDF版 最终我整理出了几份word版的 并且帮大家排版好了可直接用于书写测试大纲或报告 下载链接在我的下载中 规则包含以下 1 MISRA C 2012 2 MISRA C 200
  • Node.js入门 03:模块化规范 CommonJS 与 ES Module

    文章目录 目的 CommonJS 基础使用 module 对象 require 方法 ES Module 混合使用 总结 目的 传统的用在网页中的JavaScript代码文件与文件之中的内容都是全局相互可见的 这对于大型项目特别是多人合作的
  • 领域驱动设计:DDD分层架构

    文章目录 DDD 分层架构 DDD 分层架构最重要的原则 DDD 分层架构推动架构演进 三层架构如何演进到 DDD 分层架构 微服务架构模型有好多种 例如整洁架构 CQRS 和六边形架构等等 每种架构模式虽然提出的时代和背景不同 但其核心理
  • 近一月翻阅资料小结

    近一个月接触的东西比较多 梳理一下 Nginx Tomcat 实现负载均衡 同时采用keepalived的形式实现HA 负载后 关键问题就是session共享的问题 可实现的思路较多 Tomcat6以后本身可以使用cluster技术达成 也
  • 训练自己的ai模型(三)学习笔记与项目实操(一些概念理解杂谈)

    ai模型大火 作为普通人 我也想做个自己的ai模型 训练自己的ai模型通常需要接下来的的六步 一 收集和准备数据集 需要收集和准备一个数据集 其中包含想要训练模型的数据 这可能需要一些数据清理和预处理 以确保数据集的质量和一致性 二 选择和
  • PTA——7-3 两个数的简单计算器

    输入格式 输入整数A 符号ch和整数B 输出格式 根据符号ch 在一行中输出A ch B的值 如果ch是 则输出A B的值 如果ch是 则输出A B的值 如果ch是 则输出A B的值 如果ch是 则输出A B的值 题目保证B不为0 并且结果
  • C++泛型编程:源起、实现与意义

    C 泛型编程 源起 实现与意义 为什么泛型泛型编程 Generic Programming 最初提出时的动机很简单直接 发明一种语言机制 能够帮助实现一个通用的标准容器库 所谓通用的标准容器库 就是要能够做到 比如用一个List类存放所有可
  • [Linux]日志文件已删掉磁盘空间不释放,不重启服务进程的解决方法

    Linux 日志文件已删掉磁盘空间不释放 不重启服务进程的解决方法 问题背景 服务进程启动后 后台会有写日志的操作 当服务进程还没停掉 日志就会一直在写 这时候手动删除日志 会造成日志在linux该目录下已经删除 但是磁盘空间不会被释放掉
  • C语言函数操作大全----(超详细)

    fopen 打开文件 相关函数 open fclose 表头文件 include
  • MAC电脑常用效率工具推荐

    作者主页 IT技术分享社区 作者简介 大家好 我是IT技术分享社区的博主 从事C Java开发九年 对数据库 C Java 前端 运维 电脑技巧等经验丰富 个人荣誉 数据库领域优质创作者 华为云享专家 阿里云专家博主 个人博客 IT技术分享
  • supervisor系列:3、配置文件

    supervisor系列 3 配置文件 文章目录 supervisor系列 3 配置文件 1 文件格式 1 1 环境变量 2 unix http server 段设置 2 1 unix http server 段的值 2 2 unix ht
  • VS中Qt中ui文件和生成.h文件问题

    vs中的ui的ui xxxx h头文件是由Qt通过编译生成 vs项目属性中配置环境调用Qt安装目录下bin目录下的uic exe来自动生成代码 如果移动工程目录 而之前又把相关的ui xxx h头文件添加到工程或移动其位置 那么再次修改ui
  • sketchup 255个su常用插件)_「教程」巧用Rhino和SU,做出你想要的地形效果

    Xiao素材 地形建模教程 本期精选 教你如何做好地形效果图 1 SU部分 地形效果 SU插件安装小教程 su软件是我们现在经常会使用到的一个软件 但是在我们作图的过程中会发现 很多情况下 相对于一些复杂的图形我们需要依赖相关的插件 比如
  • python递归函数代码_Python递归函数 二分查找算法实现解析

    一 初始递归 递归函数 在一个函数里在调用这个函数本身 递归的最大深度 998 正如你们刚刚看到的 递归函数如果不受到外力的阻止会一直执行下去 但是我们之前已经说过关于函数调用的问题 每一次函数调用都会产生一个属于它自己的名称空间 如果一直