【算法】递归

递归

  • 递归
    • 初始递归:数列求和
    • 递归的应用:任意进制转换
    • 递归深度限制
    • 递归可视化:分形树
    • 递归可视化:谢尔宾斯基Sierpinski三角形
    • 递归的应用:汉诺塔
    • 递归的应用:探索迷宫
  • 分治策略和递归
  • 优化问题
    • 兑换最少个数硬币问题
  • 贪心策略

递归

递归是一种解决问题的方法,其精髓在于将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用飞常简单直接的方式来解决。
递归的问题分解方式非常独特,其算法方面的明显特征就是:在算法流程中调用自身。
递归为我们提供了一种对复杂问题的优雅解决方案。

函数自己调用自己,形如:

int f(int x){xxxxxxxxxxxxxxxreturn f(x-1);
}

初始递归:数列求和

问题:给定一个列表,返回所有数的和
列表中数的个数不定,需要一个循环和一个累加变量来迭代求和

既不能用for,也不能用while,对不确定长度的列表求和

def listsum(numList):theSum=0for i in numList:theSum=theSum+ireturn theSumprint(listsum([1,3,5,7,9]))

求和实际上由一次次的加法实现,而加法恰有2个操作数

将问题规模较大的列表求和,分解为规模较小而且固定的2个数求和

数列求和问题首先具备了基本结束条件:当

递归的应用:任意进制转换

整数转换为任意进制
十进制有10个不同符号:convString=“0123456789”
比10小的整数转换成十进制,直接查表:convString[n]
比10大的整数,拆成一系列比10小的整数,逐个查表,如769,拆成7、6、9
递归三定律里,基本结束条件为:小于10的整数;拆解整数的过程就是向“基本结束条件”演进的过程
用整数除,和求余数两个计算将整数一步步拆开
除以“进制基base”://base
对“进制基”求余数:%base
问题分解为:余数总小于“进制基base”,是基本结束条件,可直接进行查表转换
整数商成为“更小规模”问题,通过递归调用自身解决

def toStr(n,base):convertString="0123456789ABCDEF"if n<base:return convertString[n]else:return toStr(n//base,base)+convertString[n%base]print(toStr(1453,16))

当一个函数被调用的时候,系统会把调用时的现场数据压入到系统调用栈
每次调用,压入栈的现场数据称为栈帧
当函数返回时,要从调用栈的栈顶取得返回地址,恢复现场,弹出栈帧,按地址返回

递归深度限制

RecursionError
检查是否忘记设置基本结束条件,导致无限递归。
或者向基本结束条件演进太慢,导致递归层数太多,调用栈溢出

def tell_story():

在Python内置的sys模块可以获取和调整最大递归深度

递归可视化:分形树

Python的海龟作图系统tuetle moudle

import turtle
t=turtle.Turtle()
# 作图开始
for i in range(4):t

螺旋

import turtlet=turtle.Turtle()def drawSpiral(t,lineLen):if lineLen

分形:一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状,即具有自相似的性质

递归可视化:谢尔宾斯基Sierpinski三角形

面积趋于0,周长趋于∞
谢尔宾斯基三角形是由三个尺寸减半的谢尔宾斯基三角形按照品字形拼叠而成
我们无法真正做出谢尔宾斯基三角形,只能做出degree有限的近似图形
在degree有限的情况下,degree=n的三角形,由3个degree=n-1的三角形按品字形拼叠而成,边长均为degree=n的三角形的一半(规模减小)
当degree=0,则就是一个等边三角形,这是递归结束的基本条件

import turtle
def sierpinski(degree,points):colormap=['blue','red','green','white','yellow']

递归的应用:汉诺塔

规则:
一次只能移动一个
大盘子不能叠在小盘子上

假设有5个盘子串在1#柱上,需要移到3#柱上

  1. 把上面的一摞4个盘子移到2#柱上
  2. 把剩下的最大号盘子移到3#柱上
  3. 把2#柱上的4个盘子移到3#柱上

在这里插入图片描述
如果能有办法把最上面的4个盘子移到2#柱,那么问题就好解决了。接下来的问题就是把4个盘子从1#移到2#,此时问题规模已经减小:

  1. 把上面的一摞3个盘子移到3#柱上
  2. 把剩下的最大号盘子移到2#柱上
  3. 把3#柱上的3个盘子移到2#柱上

移动3个盘子可以分解为上面2个和下面的最大号盘子
移动2个盘子可以分解为上面的盘子和下面的盘子

思路:一定有三个柱子,两个柱子是无法完成的
将盘子从开始柱,经由中间柱,移到目标柱:

  1. 将上层N-1个盘子的塔,从开始柱,借助目标柱,移到中间柱;
  2. 将最大的(第N个)盘子从开始柱移到目标柱;
  3. 将放置在中间柱的N-1个盘子借助开始柱,移到目标柱

基本结束条件(最小规模问题):1个盘子的移动问题

def moveTower(height,fromPole,withPole,toPole):if height>=1:moveTower(height-1,fromPole,toPole,withPole)moveDisk(height,fromPole,toPole)moveTower(height-1,withPole,fromPole,toPole)
def moveTower(height,fromPole,withPole,toPole):if height>=1:moveTower(height-1,fromPole,toPole,withPole)moveDisk(height,fromPole,toPole)moveTower(height-1,withPole,fromPole,toPole)def moveDisk(disk,fromPole,toPole):print(f"Moving disk[{disk}] from {fromPole} to {toPole}")moveTower(3,"#1","#2","#3")

递归的应用:探索迷宫

将海归放在迷宫中间,找到出口

  1. 将整个迷宫的空间(矩形)分为行列整齐的方格,区分出墙壁和通道。每个方格具有行列位置,并赋予“墙壁”、“通道”的属性
  2. 考虑用矩阵方式来实现迷宫数据结构。采用“数据项为字符列表的列表”这两种列表的方式来保存方格内容。采用不同字符分别代表“墙壁+”、“通道 ”、“海归投放点S”,从一个文本文件读入迷宫数据
class Maze:def __init__(self,mazeFileName):rowsInMaze=0columnsInMaze=0self.mazelist=[]mazeFile=open(mazeFileName,'r')rowsInMaze=0for line in mazeFile:rowList=[]col=0for ch in line[:-1]:rowList append(ch)if ch=='S':self.startRow=rowsInMazeself.startCol=colcol=col+1rowsInMaze=rowsInMaze+1self.mazelist.append(rowList)columnsInMaze=len(rowList)

探索迷宫的递归算法思路如下:

  1. 将海龟

所以需要有个机制记录海龟走过的路径:
沿途洒“面包屑”

递归调用的基本结束条件

def carpet(N,C):def check(n,x,y):if n<=1:return Truen2=n//3if n2<=x<n2*2 and n2<=y<n2*2:return Falsereturn check(n2,x%n2,y%n2)for y in range(N):for x in range(N):if check(N,x,y):print(C,end='')else:print(' '*len(C),end='')print('')
#test
carpet(27,'[]')

分治策略和递归

将问题分为若干更小规模的部分
通过解决每一个小规模部分问题,并将结果汇总得到原问题的解
递归三定律:
基本结束条件,解决最小规模问题
缩小规模,向基本结束条件演进
调用自身来解决已缩小规模的相同问题
❖体现了分治策略
问题解决依赖于若干缩小了规模的问题
汇总得到原问题的解
❖应用相当广泛
排序、查找、遍历、求值等等

优化问题

计算机科学中许多算法都是为了找到某些
问题的最优解
例如,两个点之间的最短路径;
能最好匹配一系列点的直线;
或者满足一定条件的最小集合

兑换最少个数硬币问题

假设你为一家自动售货机厂家编程序,自动售货
机要每次找给顾客最少数量硬币;
假设某次顾客投进$1纸币,买了ȼ37的东西,要
找ȼ63,那么最少数量就是:2个quarter(ȼ25)
、1个dime(ȼ10)和3个penny(ȼ1),一共6个

贪心策略

一般我们这么做:
从最大面值的硬币开始,用尽量多的数量
有余额的,再到下一最大面值的硬币,还用尽量
多的数量,一直到penny(ȼ1)为止
因为我们每次都试图解决问题的尽量大的一部分
对应到兑换硬币问题,就是每次以最多数量的最
大面值硬币来迅速减少找零面值
❖“贪心策略”解决找零兑换问题,在美元
或其他货币的硬币体系下表现尚好

❖动态规划算法采用了一种更有条理的方式
来得到问题的解
❖找零兑换的动态规划算法从最简单的“1
分钱找零”的最优解开始,逐步递加上去
,直到我们需要的找零钱数
❖在找零递加的过程中,设法保持每一分钱
的递加都是最优解,一直加到求解找零钱
数,自然得到最优解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/241557.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

飞书修改不了名称?飞书如何修改名称,修改昵称

飞书如何修改名称 点击编辑信息 在这里修改姓名就可以啦

烟火检测/周界入侵/视频智能识别AI智能分析网关V4如何配置ONVIF摄像机接入

AI边缘计算智能分析网关V4性能高、功耗低、检测速度快&#xff0c;易安装、易维护&#xff0c;硬件内置了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;上报识别结果&#xff0c;并能进行语音告警播放。算法可按需组合、按…

制作一个Python聊天机器人

我们学习一下如何使用 ChatterBot 库在 Python 中创建聊天机器人&#xff0c;该库实现了各种机器学习算法来生成响应对话&#xff0c;还是挺不错的 什么是聊天机器人 聊天机器人也称为聊天机器人、机器人、人工代理等&#xff0c;基本上是由人工智能驱动的软件程序&#xff0…

Mysql root 密码重置详解

文章目录 1 概述1.1 前言1.2 mysql 版本查询 2 windows 操作系统2.1 mysql 8 及以上版本2.1.1 关闭 mysql 服务2.1.2 通过无认证方式启动 mysql2.1.3 新开窗口&#xff0c;登录 mysql&#xff0c;重置密码 1 概述 1.1 前言 不同的操作系统&#xff08;如&#xff1a;windows、…

网络:FTP

1. FTP 文件传输协议&#xff0c;FTP是用来传输文件的协议。使用FTP实现远程文件传输的同时&#xff0c;还可以保证数据传输的可靠性和高效性。 2. 特点 明文传输。 作用&#xff1a;可以从服务器上下载文件&#xff0c;或将本地文件上传到服务器。 3. FTP原理 FTP有控制层面…

树莓派4B +Ubuntu20.04+ROS1的使用(2)

首先确定一下主机与从机的ip地址&#xff08;非常重要&#xff09; 在这次实验中&#xff0c;主机是一台Ubuntu20.04.03系统的台式机&#xff0c;我们间通过这台准备来远程遥控树莓派上的ros1系统&#xff0c;它的ip地址是192.168.230.181 从机是一台搭载Ubuntu20.04桌面版ro…

服务器数据恢复—OceanStor存储raid5热备盘同步数据失败的数据恢复案例

服务器数据恢复环境&#xff1a; 华为OceanStor某型号存储&#xff0c;存储内有一组由24块硬盘组建的raid5阵列&#xff0c;配置1块热备盘。 服务器故障&#xff1a; 该存储raid5阵列中有一块硬盘离线&#xff0c;热备盘自动激活并开始同步数据&#xff0c;在热备盘同步数据的…

动手学深度学习6 自动求导

自动求导 1. 自动求导2. 自动求导实现1. 示例 y 2 X T X y2X^TX y2XTX 关于列向量x求导。2. 非标量变量的反向传播3. 分离计算4. Python控制流的梯度计算 QA1. ppt上隐式构造和显示构造为什么看起来差不多&#xff1f;2. 需要正向反向都算一遍吗3. 为什么pytorch会默认累积梯…

Go 中 slice 的 In 功能实现探索

文章目录 遍历二分查找map key性能总结 之前在知乎看到一个问题&#xff1a;为什么 Golang 没有像 Python 中 in 一样的功能&#xff1f;于是&#xff0c;搜了下这个问题&#xff0c;发现还是有不少人有这样的疑问。 补充&#xff1a;本文写于 2019 年。GO 现在已经支持泛型&am…

ICCV2023 | PTUnifier+:通过Soft Prompts(软提示)统一医学视觉语言预训练

论文标题&#xff1a;Towards Unifying Medical Vision-and-Language Pre-training via Soft Prompts 代码&#xff1a;https://github.com/zhjohnchan/ptunifier Fusion-encoder type和Dual-encoder type。前者在多模态任务中具有优势&#xff0c;因为模态之间有充分的相互…

游卡:OceanBase在游戏核心业务的规模化降本实践

从 2023 年 9 月测试 OceanBase&#xff0c;到如今 3 个核心业务应用 OceanBase&#xff0c;国内最早卡牌游戏研发者之一的游卡仅用了两个月。是什么原因让游卡放弃游戏行业通用的 MySQL方案&#xff0c;选择升级至 OceanBase&#xff1f;杭州游卡网络技术有限公司&#xff08;…

ConcurrentHashMap介绍

一、ConcurrentHashMap 1.1 存储结构 ConcurrentHashMap是线程安全的HashMap ConcurrentHashMap在JDK1.8中是以CASsynchronized实现的线程安全 CAS&#xff1a;在没有hash冲突时&#xff08;Node要放在数组上时&#xff09; synchronized&#xff1a;在出现hash冲突时&…

element中Table表格控件单选、多选功能进一步优化

目录 一、代码实现1、 父组件2、子组件&#xff08;弹框&#xff09; 二、效果图 一、代码实现 1、 父组件 <template><div><!-- 用户选择嵌套弹框 --><el-dialog :close-on-click-modal"false" :close-on-press-escape"false" tit…

端到端自动驾驶

自动驾驶主要流程&#xff1a;感知->预测->规划 预测是预测周围目标&#xff08;车、行人、动物等&#xff09;的轨迹&#xff0c;规划是规划自车的运动轨迹。 UniAD[CVPR 2023]: 使用transformer架构&#xff0c;统一自动驾驶流程&#xff0c;完成所有检测&#xff0c…

惊心!读写台灯国检结果发布:不合格87.5%都因照度和照度均匀度!

近日&#xff0c;国家市场监管总局正式对外发布“2023年烟花爆竹、羽绒服装等13种产品质量国家监督抽查情况通报”&#xff0c;涉及读写台灯、固定式通用灯具、嵌入式灯具等3类照明产品第二批国抽情况。本次国抽情况显示&#xff0c;包括316家照明相关生产和销售单位所属的361批…

仿三方智能对话分析原始会话窗口

设计效果如下&#xff1a; 设计要求如下&#xff1a; 1、顶部播放条播放时&#xff0c;文字内容自动滚动。 监听audio事件timeupdate&#xff0c;只要播放器在播放就会触发该事件。每行文字有开始时间begin。判断当前时间&#xff08;currentTime&#xff09;<开始时间&am…

JAVA实现向Word模板中插入Base64图片和数据信息

目录 需求一、准备模板文件二、引入Poi-tl、Apache POI依赖三、创建实体类&#xff08;用于保存向Word中写入的数据&#xff09;四、实现Service接口五、Controller层实现 需求 在服务端提前准备好Word模板文件&#xff0c;并在用户请求接口时服务端动态获取图片。数据等信息插…

[UofTCTF 2024]

最近没有比赛&#xff0c;拿个国外刚比完的练练手。只是网站太慢了&#xff0c;点任何一处都得等一分钟。而且pwn的远程都开不了。不过pwn过于简单&#xff0c;连本地都没调&#xff0c;当是个pwn概念吧。 Crypto repeat 题 import os import secretsflag "REDACATED…

限流算法之固定窗口算法

文章目录 原理示例图 优缺点优点缺点 示例代码java 适用场景不推荐原因如下&#xff1a; 原理 固定窗口算法是一种常见的限流算法&#xff0c;它通过在固定长度的时间窗口内限制请求数量来实现限流。这种算法的原理是在每个时间窗口内&#xff0c;对到达的请求进行计数&#x…

【EI会议征稿通知】第七届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2024)

第七届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2024&#xff09; 2024 7th International Conference on Advanced Electronic Materials, Computers and Software Engineering 第七届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2024)将于2024年5月10-1…