当前位置: 首页 > news >正文

【算法】递归

递归

  • 递归
    • 初始递归:数列求和
    • 递归的应用:任意进制转换
    • 递归深度限制
    • 递归可视化:分形树
    • 递归可视化:谢尔宾斯基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
分钱找零”的最优解开始,逐步递加上去
,直到我们需要的找零钱数
❖在找零递加的过程中,设法保持每一分钱
的递加都是最优解,一直加到求解找零钱
数,自然得到最优解

相关文章:

【算法】递归

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

DC-1靶机刷题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1GX7qOamdNx01622EYUBSow?pwd9nyo 提取码&#xff1a;9nyo 参考答案&#xff1a; https://c3ting.com/archives/kai-qi-vulnhnbshua-tiDC-1.pdf【【基础向】超详解vulnhub靶场DC-1】 https://www.bilibi…...

rust跟我学七:获取外网IP地址

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info是怎么获取到本机的外网IP地址。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:[…...

华为:交换机忘记console密码重置

一、背景 许多旧项目经过长时间使用后&#xff0c;因为没有特定的管理运维人员&#xff0c;初始对接人也将初始账号密码等重要信息丢失&#xff0c;现需要进后台查看配置或更改网络配置&#xff0c;需重置密码 二、重置密码&#xff0c;不重置设备方法 1、使用console插入交…...

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题三 模块一

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…...

Go 中 slice 的 In 功能实现探索

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

pyDAL一个python的ORM(终) pyDAL的一些性能优化

一、大批量插入数据 对于 大量数据插入时&#xff0c;虽然pyDAL也手册中有个方法&#xff1a;bulk_insert()&#xff0c;但是手册也说了&#xff0c;虽然方法上是一次可以多条数据&#xff0c;如果后端数据库是关系型数据库&#xff0c;他转换为SQL时它是一条一条的插入的&…...

springboot log4j配置xml实例说明

提供样本配置代码 xml <?xml version"1.0" encoding"UTF-8"?> <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!-- status log4j2内部日志级别 --> <configurat…...

VsCode重新安装需要配机的ESLint和 Prettier - Code formatter 配置

新电脑安装完Vscode后&#xff0c;需要装几个插件&#xff0c;这里记录下&#xff1a; {"diffEditor.ignoreTrimWhitespace": false,"files.autoSave": "afterDelay","editor.codeActionsOnSave": {"source.fixAll.eslint"…...

录屏功能怎么打开?简单操作,一学就会!

录屏功能在当今互联网时代变得越来越重要&#xff0c;无论是游戏录制、在线课程录制还是屏幕操作演示&#xff0c;录屏功能都为我们提供了便捷的解决方案。可是您知道录屏功能怎么打开吗&#xff1f;接下来&#xff0c;让我们一起探索如何在电脑上开启录屏功能&#xff0c;记录…...

小程序显示兼容处理,home键处理

定义&#xff1a; env(safe-area-inset-bottom)和env(safe-area-inset-top)是CSS中的变量&#xff0c;用于获取设备底部和顶部安全区域的大小 示例&#xff1a; padding-bottom: calc(env(safe-area-inset-bottom) 12px); /* 兼容iOS> 11.2 */安全间距类型&#xff1a; …...

【java八股文】之JVM基础篇

【java八股文】之JVM基础篇-CSDN博客 【java八股文】之MYSQL基础篇-CSDN博客 【java八股文】之Redis基础篇-CSDN博客 【java八股文】之Spring系列篇-CSDN博客 【java八股文】之分布式系列篇-CSDN博客 【java八股文】之多线程篇-CSDN博客 【java八股文】之JVM基础篇-CSDN博…...

2024美赛数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…...

【EI会议征稿通知】2024年通信技术与软件工程国际学术会议 (CTSE 2024)

2024年通信技术与软件工程国际学术会议 (CTSE 2024) 2024 International Conference on Communication Technology and Software Engineering (CTSE 2024) 2024年通信技术与软件工程国际学术会议 (CTSE 2024)将于2024年03月15-17日在中国长沙举行。会议专注于通信技术与软件工…...

Js面试之作用域与闭包

Js面试之作用域与闭包 作用域词法作用域动态作用域 闭包闭包使用场景封装私有变量模块化开发保持变量状态异步操作 注意事项 最近在整理一些前端面试中经常被问到的问题&#xff0c;分为vue相关、react相关、js相关、react相关等等专题&#xff0c;可持续关注后续内容&#xff…...

Go 爬虫之 colly 从入门到不放弃指南

文章目录 概要介绍如何学习官方文档如何安装快速开始如何配置调试分布式代理层面执行层面存储层面存储多收集器配置优化持久化存储启用异步加快任务执行禁止或限制 KeepAlive 连接扩展总结如果想用 GO 实现爬虫能力,该如何做呢?抽时间研究了 Go 的一款爬虫框架 colly。 概要…...

Ceph分布式存储(1)

目录 一.ceph分布式存储 Ceph架构&#xff08;自上往下&#xff09; OSD的存储引擎&#xff1a; Ceph的存储过程&#xff1a; 二. 基于 ceph-deploy 部署 Ceph 集群 20-40节点上添加3块硬盘&#xff0c;一个网卡&#xff1a; 10节点为admin&#xff0c;20-40为node&…...

制造业工厂为什么要实施MES系统呢?

MES是生产管理系统&#xff0c;生产管理是通过对生产系统的战略计划、组织、指挥、实施、协调、控制等活动&#xff0c;实现系统的物质变换、产品生产、价值提升的过程。在企业的价值链中&#xff0c;生产经营是企业核心能力的重要组成部分。 实施MES系统的原因 MES系统是中国比…...

Python 一行命令部署http、ftp服务

Python 一行命令部署http服务 文章目录 Python 一行命令部署http服务具体操作命令如下浏览器返回下载Python 一行命令部署FTP服务 具体操作命令如下 这个比nginx相对来说更加简单&#xff0c;可以用于部署特殊场景时如银行等部署时&#xff0c;各种权限控制&#xff0c;内网之间…...

DBA技术栈(三):MySQL 性能影响因素

文章目录 前言一、影响MySQL性能的因素1.1 商业上的需求1.2 应用架构规划1.3 查询语句使用方式1.4 Schema的设计1.5 硬件环境 总结 前言 大部分人都一致认为一个数据库应用系统&#xff08;这里的数据库应用系统概指所有使用数据库的系统&#xff09;的性能瓶颈最容易出现在数…...

SpringCloud GateWay 在全局过滤器中注入OpenFeign网关后无法启动

目录 一、问题 二、原因 1、修改配置 2、添加Lazy注解在client上面 3、启动成功 一、问题 当在gateway的全局过滤器GlobalFilter中注入OpenFeign接口的时候会一直卡在路由中&#xff0c;但是不会进一步&#xff0c;导致启动未成功也未报错失败 2024-01-18 22:06:59.299 I…...

web前端项目-贪吃蛇小游戏【附源码】

web前端项目-贪吃蛇小游戏 【贪吃蛇】是一款经典的小游戏&#xff0c;采用HTML、CSS和JavaScript技术进行开发&#xff0c;玩家通过控制一条蛇在地图上移动&#xff0c;蛇的目的是吃掉地图上的食物&#xff0c;并且让自己变得更长。游戏的核心玩法是控制蛇的移动方向和长度&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;因为模态之间有充分的相互…...

代码随想录 Leetcode459. 重复的子字符串(KMP算法)

题目&#xff1a; 代码&#xff08;首刷看解析 KMP算法 2024年1月18日&#xff09;&#xff1a; class Solution { public:void getNext(string& s,vector<int>& next) {int j 0;next[0] j;for (int i 1; i < s.size(); i) {while (j > 0 && s…...

Rust之构建命令行程序(三):重构改进模块化和错误处理

开发环境 Windows 10Rust 1.74.1 VS Code 1.85.1 项目工程 这次创建了新的工程minigrep. 重构改进模块化和错误处理 为了改进我们的程序&#xff0c;我们将修复与程序结构及其处理潜在错误的方式有关的四个问题。首先&#xff0c;我们的main函数现在执行两项任务:解析参数和…...

广和通AI解决方案“智”赋室外机器人迈向新天地!

大模型趋势下&#xff0c;行业机器人将具备更完善的交互与自主能力&#xff0c;逐步迈向AI 2.0时代&#xff0c;成为人工智能技术全面爆发的重要基础。随着行业智能化&#xff0c;更多机器人应用将从“室内”走向“室外”&#xff0c;承担更多高风险、高智能工作。复杂的室外环…...

C++I/O流——(4)格式化输入/输出(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…...

九、K8S-label和label Selector

label和label selector 标签和标签选择器 1、label 标签&#xff1a; 一个label就是一个key/value对 label 特性&#xff1a; label可以被附加到各种资源对象上一个资源对象可以定义任意数量的label同一个label可以被添加到任意数量的资源上 2、label selector 标签选择器 L…...

【.NET Core】 多线程之(Thread)详解

【.NET Core】 多线程之&#xff08;Thread&#xff09;详解 文章目录 【.NET Core】 多线程之&#xff08;Thread&#xff09;详解一、概述二、线程的创建和使用2.1 ThreadStart用于无返回值&#xff0c;无参数的方法2.2 ParameterizedThreadStart:用于带参数的方法 三、线程的…...

苹果笔记本 macbook 在 office word 中使用 mathtype 的方法

前言 想在 MacBook 中使用 mathtype&#xff0c;去搜索&#xff0c;去 Apple Store 下载也发现没有 解决方法 打开 office Word 的「插入」中的「获取加载项」、「我的加载项」。 在应用商店中下载&#xff0c;需要登录自己的微软账号。 加载成功后就可以使用了。 注意 和…...