递归 python

  ↵一、简单理解

解决问题的一种方法,它将问题不断的分成更小的子问题,直到子问题可以用普通的方法解决。通常情况下,递归会使用一个不停调用自己的函数。

【注】:每一次递归调用都是在解决一个更小的问题,如此进行下去,直到问题本身不能在简化为止

例子:

1.列表元素之和

# 求列表元素之和
def sumList(numlist):'''循环计算列表和:param numlist:数值列表:return: 和'''sum = 0for num in numlist:sum += numreturn sumdef listnum(numlist):'''递归计算列表和:param numlist: 数值列表:return: 和'''if len(numlist) == 1:return numlist[0]else:return numlist[0] + listnum(numlist[1:])if __name__ == "__main__":numlist = [1, 2, 3, 4, 5, 6]a = sumList(numlist)b = listnum(numlist)print("循环计算结果:%f,递归计算结果:%f" % (a, b))

2.整数转换进制

# 将整数转换成以2-16为进制基数的字符串
def toStr(n, base):'''将输入的整数n转换成2-16任意进制的字符串:param n: 任意正整数:param base: 2-16中进制:return: 转换好的字符串'''convertString = "0123456789ABCDEF"if n < base:return convertString[n]else:return toStr(n // base, base) + convertString[n % base]if __name__ == "__main__":n = 10base = 2print("十进制数:%d 转换成二进制数:%s" % (n, toStr(n,base)))#字符的拼接

另外不使用字符拼接的方式

from main import Stack# 将整数转换成以2-16为进制基数的字符串
rStack = Stack()def toStr(n, base):'''将输入的整数n转换成2-16任意进制的字符串,不使用字符拼接,而是通过栈帧:param n: 任意正整数:param base: 2-16中进制:return: 转换好的数值存储栈帧'''convertString = "0123456789ABCDEF"if n < base:rStack.push(convertString[n])else:rStack.push(convertString[n % base])toStr(n // base, base)return rStackif __name__ == "__main__":n = 100base = 2numStack = toStr(n, base)print("整数%d转换为%d进制为:" % (n, base), end="")while numStack.size() >= 1:print(numStack.pop(), end="")

二、可视化

使用python中的画图工具进行简单递归程序的绘画,从而理解递归的概念

1.螺旋线

#用turtle模块递归的绘制螺旋线
from turtle import *myTurtle = Turtle()
myWin = myTurtle.getscreen()def drawSpiral(myTurtle, lineLen):if lineLen > 0:myTurtle.forward(lineLen)myTurtle.right(90)drawSpiral(myTurtle, lineLen - 5)drawSpiral(myTurtle, 100)
myWin.exitonclick()#用户在窗口内再次点击之后,程序清理并退出

2.分形树

#无法绘画出来的
from turtle import *myTurtle = Turtle()
myWin = myTurtle.getscreen()def tree(brancheLen, t):if brancheLen > 5:t.forward(brancheLen)t.right(20)tree(brancheLen-15,t)t.left(40)tree(brancheLen-10,t)t.right(20)t.backward(brancheLen)t = Turtle()
myWin = t.getscreen()
t.left(90)
t.up()
t.backward(100)
t.down
tree(110,t)
myWin.exitonclick()

chatGPT中给的代码

#能绘画出来
import turtledef draw_branch(t, length):if length > 5:t.forward(length)  # 绘制主干t.right(20)  # 右转一定角度draw_branch(t, length - 15)  # 递归绘制右侧分支t.left(40)  # 左转一定角度draw_branch(t, length - 15)  # 递归绘制左侧分支t.right(20)  # 右转一定角度t.backward(length)  # 返回原点def main():# 设置窗口和画笔window = turtle.Screen()window.bgcolor("white")t = turtle.Turtle()t.speed(0)  # 设置绘制速度为最快# 调整画笔位置和方向t.left(90)t.up()t.backward(200)t.down()# 绘制分形树draw_branch(t, 100)# 等待用户点击关闭窗口turtle.mainloop()if __name__ == "__main__":main()

3.谢尔平斯基三角形

chatGPT所给的代码---可运行

import turtledef draw_triangle(t, order, size):if order == 0:for _ in range(3):t.forward(size)t.left(120)else:draw_triangle(t, order - 1, size / 2)t.forward(size / 2)draw_triangle(t, order - 1, size / 2)t.backward(size / 2)t.left(60)t.forward(size / 2)t.right(60)draw_triangle(t, order - 1, size / 2)t.left(60)t.backward(size / 2)t.right(60)def main():# 设置窗口和画笔window = turtle.Screen()window.bgcolor("white")t = turtle.Turtle()t.speed(0)  # 设置绘制速度为最快# 调整画笔位置和方向t.up()t.goto(-200, -150)t.down()# 绘制谢尔平斯基三角形draw_triangle(t, 5, 400)# 隐藏画笔t.hideturtle()# 等待用户点击关闭窗口turtle.mainloop()if __name__ == "__main__":main()

b站上所学

# 绘制谢尔平斯基三角形
#B站--python递归三部曲(基于turtle实现可视化)
import turtlet = turtle.Turtle()def get_midpoint(a, b):'''得到两点的中点坐标:param a: 坐标点(元组):param b: 坐标点(元组):return: 中点坐标(元组)'''ax, ay = abx, by = breturn ((ax + bx) / 2, (ay + by) / 2)def draw_triangle(a, b, c):'''绘制以a,b,c为顶点的三角形:param a: 顶点坐标(元组):param b: 顶点坐标(元组):param c: 顶点坐标(元组):return: 无返回值'''ax, ay = abx, by = bcx, cy = ct.penup()  # 提起画笔t.goto(a)  # 画笔移动到a点的位置t.pendown()  # 落下画笔t.goto(b)  # 画出ab线段t.goto(c)  # 画出bc线段t.goto(a)  # 画出ca线段t.penup()def draw_sierpinski(triangle, depth):a, b, c = triangle  # triangle包括三个顶点的元组draw_triangle(a, b, c)if depth == 0:returnelse:d = get_midpoint(a, b)e = get_midpoint(b, c)f = get_midpoint(c, a)adf = (a, d, f)dbe = (d, b, e)fec = (f, e, c)draw_sierpinski(adf, depth - 1)draw_sierpinski(dbe, depth - 1)draw_sierpinski(fec, depth - 1)if __name__ == "__main__":triangle = ((-200,-100),(0,200),(200,-100))draw_sierpinski(triangle,4)

4.汉诺塔

不能可视化的

#B站---python递归三部曲(基于turtle实现可视化)
#汉诺塔
def moveDisk(diskIndex,fromPole,toPole):'''从起始塔向目标塔移动圆环:param diskIndex:圆环:param fromPole:起始塔:param toPole:目标塔:return:无'''print_str = 'Move disk %s from %s to %s' %(diskIndex,fromPole,toPole)print(print_str)def moveTower(height,fromPole,withPole,toPole):'''汉诺塔的递归调用函数:param height: 汉诺塔高度:param fromPole: 起始塔:param withPole: 中转塔:param toPole: 目标塔:return:'''if height == 1:moveDisk(1,fromPole,toPole)else:moveTower(height-1,fromPole,toPole,withPole)moveDisk(height,fromPole,toPole)moveTower(height-1,withPole,fromPole,toPole)if __name__ == "__main__":moveTower(3,"A","B","C")

能可视化的

#自己对着B站视频写的一半,但是无法正确跑,不过注释都是正确的意思
import turtledef set_plate(i):'''绘制第i层圆盘:return:'''size = 20  # 圆盘转弯半径基数l = size * (i + 2)  # 第i层圆盘半径t = turtle.Turtle()t.hideturtle()  # 隐藏画笔t.penup()  # 提起画笔t.left(90)  # 每次先逆时针旋转90度,新建的左转90度为设置时的图案。t.begin_poly()  # 绘制记录t.forward(l)  # 向前走40t.circle(size, 180)  # 画一个半径为20,角度为180的弧t.forward(l * 2)t.circle(size, 180)t.forward(l)t.end_poly()  # 结束记录turtle.register_shape("plate_%s" % i, p)  # 取出记录的情况,给不同层的圆盘赋值不同的名称def set_tower():'''绘制塔:return:'''# 塔的参数:宽、高、转弯半径tower_width = 100tower_height = 200tower_radius = 10t = turtle.Turtle()t.hideturtle()  # 隐藏画笔t.penup()  # 提起画笔t.left(90)t.begin_poly()t.forward(tower_width)t.circle(tower_radius, 180)t.forward(tower_width - tower_radius)t.right(90)t.forward(tower_height)t.circle(tower_radius, 180)t.forward(tower_height)t.right(90)t.forward(tower_width - tower_radius)t.circle(tower_radius, 180)t.forward(tower_width)t.end_poly()turtle.register_shape("tower")def draw_towers():# 塔的参数:塔之间的距离,塔的海拔高度tower_distance = 250tower_altitude = -100set_tower()tower = turtle.Turtle("tower")tower.speed(0)  # 0是最快的速度tower.penup()tower.goto(-tower_distance, tower_altitude)  # 移动到(-250,-100)位置tower.stamp()  # 一直显示出来tower.goto(0, tower_altitude)tower.stamp()tower.goto(tower_distance, tower_altitude)if __name__ == "__main__":draw_towers()set_plate(1)plate = turtle.Turtle("plate_1")plate.forward(200)turtle.done()

B站博主所写代码参考网址:需要魔法(可参考网络代理文章)

#能可视化代码,但是turtle库的绘制方法不熟悉
import turtle# ==============
#  常量设置
# ==============
N = 7  # 汉诺塔层数限制BasePL = 12  # plate的大小基数,修改这个能够调整plate的大小
TowerP = 5  # Tower的线宽
TowerW = 110  # Tower的底座宽度
TowerH = 200  # Tower的高度
TowerSpace = 260  # Tower的之间的距离,从中心到中心
HORIZON = -100  # Tower的底座高度,用于定位
# 动画速度,5是比较适中的速度
PMS = 5# 优化处理
Isjump = TruePOLES = {"1": [],"2": [],"3": [],
}
PLATES = []  # 存储所有圆盘对象# 塔的颜色
LineColor = "black"
# 多个盘子的颜色
FillColors = ["#d25b6a","#d2835b","#e5e234","#83d05d","#2862d2","#35b1c0","#5835c0"
]
# 建立窗体
SCR = turtle.Screen()
# SCR.tracer()
SCR.setup(800, 600)  # 设置窗体大小# 设置圆盘形状
def set_plate(pi=0):_pi = pi + 2t = turtle.Turtle()t.hideturtle()t.speed(0)t.penup()t.begin_poly()t.left(90)t.forward(BasePL * _pi)t.circle(BasePL, 180)t.forward(BasePL * 2 * _pi)t.circle(BasePL, 180)t.forward(BasePL * _pi)t.end_poly()p = t.get_poly()pname = 'plate_%s' % piSCR.register_shape(pname, p)# 设置塔柱形状
def set_tower():t = turtle.Turtle()t.hideturtle()t.speed(0)t.penup()t.begin_poly()t.left(90)t.forward(TowerW)t.circle(-TowerP, 180)t.forward(TowerW)t.forward(TowerW)t.circle(-TowerP, 180)t.forward(TowerW - TowerP / 2)t.left(90)t.forward(TowerH)t.circle(-TowerP, 180)t.forward(TowerH)t.end_poly()p = t.get_poly()SCR.register_shape('tower', p)# 绘制塔柱
def draw_towers():set_tower()for tx in [-TowerSpace, 0, TowerSpace]:t3 = turtle.Turtle('tower')t3.penup()t3.goto(tx, HORIZON)# 绘制圆盘
def draw_plates(pn=4):plates = []for i in range(pn):set_plate(i)_plate = 'plate_%s' % i_p = turtle.Turtle(_plate)_colorIdx = i % len(FillColors)_color = FillColors[_colorIdx]_p.color(_color, _color)_p.speed(PMS)plates.append(_p)# 反序,大的在前,小的在后global PLATESPLATES = plates[:]# 绘制移动过程
def draw_move(diskIndex, fromPindex, toPindex):p = PLATES[diskIndex - 1]index_loc = {"A": 1,"B": 2,"C": 3}toP = index_loc.get(toPindex, None)fromP = index_loc.get(fromPindex, None)p.penup()mx = (toP - 2) * TowerSpacemy = HORIZON + len(POLES[str(toP)]) * BasePL * 2if fromP != None:POLES[str(fromP)].remove(p)if Isjump:px, py = p.pos()p.goto(px, TowerH + py)p.goto(mx, TowerH + py)p.goto(mx, my)POLES[str(toP)].append(p)# 将所有圆盘移动到起点
def movetoA(n, fromPindex):for i in range(n, 0, -1):draw_move(i, None, fromPindex)# 移动指定层圆盘diskIndex,从fromPole出发,到达toPole
def moveDisk(diskIndex, fromPole, toPole):""":param diskIndex: 圆盘的索引(从上往下,第一层为1,第二层为2、、、第n层为n):param fromPole: 出发的柱子(起点):param toPole: 要到达的柱子(终点):return:"""draw_move(diskIndex, fromPole, toPole)# 核心函数,入口
def moveTower(height, fromPole, withPole, toPole):""":param height: 汉诺塔高度——层数:param fromPole: 出发的柱子(起点):param withPole: 进过的柱子(中转点):param toPole: 要到达的柱子(终点):return:"""if height == 1:# 基础情形:一层的汉诺塔moveDisk(1, fromPole, toPole)return# 先将圆盘1到n - 1看作一个整体从起点塔移动到中转塔(用目标塔作为本步骤的中转)moveTower(height - 1, fromPole, toPole, withPole)# 再将圆盘n从起点塔A移动到目标塔CmoveDisk(height, fromPole, toPole)# 最后将圆盘1到n - 1看作一个整体从中转塔移动到目标塔(用起点塔作为本步骤的中转)moveTower(height - 1, withPole, fromPole, toPole)if __name__ == '__main__':# 调用# 三层汉诺塔,A为出发柱子,B为中转柱子,C为目标柱子n = NSCR.tracer(0)draw_towers()draw_plates(n)movetoA(n, "A")SCR.tracer(1)# SCR.delay(3)moveTower(n, "A", "B", "C")turtle.done()

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

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

相关文章

内核编译-02

1配置【u-boot】 查看版本信息 对arm文件进行编译的专用工具 打开脚本文件 配置脚本文件 编译【.c】文件 创建目录&#xff0c;解压文件夹&#xff1a; 编译【smdk2440_config】&#xff0c;并产生【u-boot.bin】&#xff1a; 2配置开发板对应的配置文件 这里采用菜单…

基于深度学习的光场超分辨率算法综述

摘要&#xff1a;光场图像分辨率低的原因之一是光场空间分辨率和角度分辨率之间存在相互制约。光场超分辨率技术旨在从低分辨率光场图像中重建出高分辨率光场图像。基于深度学习的光场超分辨率方法通过学习高、低分辨率光场图像之间的映射关系来提升图像的质量&#xff0c;突破…

亚马逊Bedrock凭借Anthropic的开创性Claude 3系列扩展了AI产品组合

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

云服务器部署Springboot项目

前端项目打包 修改ip地址 在控制台输入npm run build:prod 会产生dist文件 将dist文件中的内容移动至/usr/local/nginx/html目录下 后端项目打包 修改ip地址 执行clean操作 执行install操作 将生成的target文件中的jar包移动至/usr/local/src目录下 启动 注意⚠️&#xff…

动态规划-不同路径

LCR 098. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 对于动态规划类型的题目&#xff0c;可以从以下角度去思考问题 1. 状态表示 机器人在每一个网格节点的状态 dp[i][j] &#xff0c;可以理解从 起始点 为走到 [i,j] &#xff0c;一共有多少种方式&#xff1b; 2. …

vscode按ctrl+鼠标左键没反应

vscode按ctrl鼠标左键没反应 问题问题解决 问题 新买的阿里云服务器,在连接vscode后,按ctrl鼠标左键没反应,怎么办? 问题解决 你没有在vscode上安装c的相关插件,安装之后才可以实现按ctrl鼠标左键跳转到函数的定义

硬件设备杂记——12G SDI及 AES67/EBU

常见的 SDI线缆规格&#xff0c;HD-SDI又被称为1.5G-SDI&#xff0c;具体参数以秋叶原的参数为例 AES67/EBU 目前音频网络标准主要集中在OSI网络体系的第二层和第三层。 第二层音频标准的弊端在于构建音频网络时需要专用的交换机&#xff0c;无法利用现有的以太网络&#xff0c…

Matlab|【免费】【sci】考虑不同充电需求的电动汽车有序充电调度方法

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现sci文献《A coordinated charging scheduling method for electric vehicles considering different charging demands》&#xff0c;主要实现电动汽车协调充电调度方法&#xff0c;该方法主要有以…

Flask + Bootstrap vs Flask + React/Vue:初学者指南

在这篇博客文章中&#xff0c;我们将比较 Flask Bootstrap 和 Flask React/Vue 这两种技术栈&#xff0c;以帮助初学者了解哪种组合更适合他们的项目需求。我们将从学习曲线、易用性、依赖管理、构建部署和路由定义等方面进行比较。 学习曲线 Flask 是一个基于 Python 的轻…

【Unity】申请D-U-N-S邓氏编码流程

标题 在使用苹果开发者账号的时候&#xff0c;我们需要用到D-U-N-S邓氏编码&#xff0c;那如何申请呢&#xff1f;最近正好帮朋友申请了一个&#xff0c;接下来我来演示一下申请流程。 1.登录苹果开发者账号 登录连接&#xff1a;Apple Developer 没有账号的自己注册一个 2…

Python-VBA函数之旅-format函数

目录 一、format函数的常见应用场景&#xff1a; 二、format函数的语法结构&#xff1a; 1、format函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://blog.csdn.net/ygb_1024?spm1010.2135.…

vivo怎么录屏?玩转手机新体验!(2024最新)

“最近新入手了一款vivo手机&#xff0c;感觉用起来真的很顺手&#xff0c;各种功能都很强大。昨天和朋友一起打游戏&#xff0c;突然想到要记录下精彩瞬间&#xff0c;但是找遍了手机&#xff0c;都没有找到录屏功能。我想请教一下各位vivo手机用户&#xff0c;你们通常在哪里…

深入剖析Tomcat(三) 实现一个简易连接器

Tomcat中的servlet容器叫做Catalina&#xff0c;Catalina有两个主要模块&#xff1a;连接器与容器。在本章&#xff0c;将会建立一个连接器来增强第二章中应用程序的功能&#xff0c;用一种更好的方式来创建request与response对象。 截止文章编写日期&#xff0c;servlet规范已…

网络流的C++代码实现与过程讲解

网络流是一种非常重要的图论算法,它在许多实际问题中得到广泛应用。本文将介绍网络流算法的C++代码实现与过程讲解。 算法概述 网络流算法是通过将图中的边看作流量通道,将图的点看作流量的起点或终点,来求解图中的最大或最小流量的问题。它是一种非常重要的最优化算法,广…

Python教学入门:列表与元组

列表&#xff08;Lists&#xff09;&#xff1a; 定义&#xff1a; 列表是 Python 中最常用的数据类型之一&#xff0c;用于存储一组有序的元素。列表使用方括号 [] 定义&#xff0c;元素之间用逗号 , 分隔。 特点&#xff1a; 列表是可变的&#xff08;Mutable&#xff09;…

Java梳理

梳理 1.ResponseBody return “hello world!” 当需要返回一个值的时候&#xff0c;需要使用到ResponseBody RestControllerControllerResponseBody 1.1没有Controller就不能写 GetMapping("/hello") public String sayHello() { return "Hello, wor…

HQL,SQL刷题,尚硅谷(中级)

目录 相关表结构&#xff1a; 1、order_info表 2、order_detail表 题目及思路解析&#xff1a; 第一题&#xff0c;查询各品类销售商品的种类数及销量最高的商品 第二题 查询用户的累计消费金额及VIP等级 第三题 查询首次下单后第二天连续下单的用户比率 总结归纳&#xff1a…

【双指针】

目录 1. LeetCode 283. 移动零 1.1 题目描述 1.2 题目思路 1.3 实现代码 2. LeetCode 1089. 复写零 2.1 题目描述 2.2 题目思路 2.3 实现代码 3. LeetCode 202. 快乐数 3.1 题目描述 3.2 题目思路 3.3 实现代码 4. LeetCode 11. 盛水最多的容器 4.1 题目描述 …

Debian12 中重新安装MSSQL 并指定服务器、数据库、数据表字段的字符排序规则和默认语言等参数

在 Linux 上配置 SQL Server 设置 - SQL Server | Microsoft Learn 零、查看sql server 服务器支持的字符排序规则 SELECT Name from sys.fn_helpcollations() where name Like Chinese% go------ Chinese_PRC_CI_AI Chinese_PRC_CI_AI_WS Chinese_PRC_CI_AI_KS Chinese_PRC_…

FPGA中闪灯程序设计示例

在FPGA设计中&#xff0c;闪灯的作用主要是用于测试和验证设计的功能和性能。具体来说&#xff0c;闪灯可以作为一个可视化的指示器&#xff0c;通过控制LED灯的闪烁模式和频率&#xff0c;来显示FPGA的工作状态或调试信息。 例如&#xff0c;在设计过程中&#xff0c;可以编写…