递归 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,一经查实,立即删除!

相关文章

python安装pytorch@FreeBSD(失败)

pip 安装 在FreeBSD系统下pip安装pytorch&#xff0c;报错 Building wheels for collected packages: pytorchBuilding wheel for pytorch (setup.py) ... errorerror: subprocess-exited-with-error python setup.py bdist_wheel did not run successfully.│ exit code: 1╰…

内核编译-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…

使用Django Rest Framework设计与实现用户注册API

使用Django Rest Framework设计与实现用户注册API 在现代Web应用开发中&#xff0c;RESTful API已成为前后端分离架构中的关键组件。Django Rest Framework (DRF) 是一款基于Django的优秀库&#xff0c;提供了丰富的工具和接口&#xff0c;极大地简化了RESTful API的设计与实现…

Oracle和SQL Server区别

首先&#xff0c;从操作的平台来看&#xff0c;Oracle具有更高的灵活性&#xff0c;它可以在所有主流平台上运行&#xff0c;并采用了开放的策略目标&#xff0c;使得客户可以选择最适合他们特定需要的解决方案。这意味着客户可以利用很多种第三方应用程序和工具。相比之下&…

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

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

Python3:读取和处理超大文件

在日常工作中&#xff0c;文件对象是我们常接触到的可迭代类型之一。一般用 for 循环遍历一个文件对象&#xff0c;可以逐行读取它的内容。但这种方式在碰到大文件时&#xff0c;可能会出现一些奇怪的效率问题。 需求&#xff1a; 小明是一位 Python 初学者&#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…

安装Git并设置用户信息

安装Git并设置用户信息的过程如下&#xff1a; 安装Git 在Windows系统上&#xff1a; 访问官方Git下载页面&#xff1a;Git - Downloading Package下载适用于Windows系统的安装程序&#xff08;.exe文件&#xff09;。运行安装程序&#xff0c;按照向导进行安装&#xff0c;…

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.…

【OceanBase诊断调优 】—— 建索引执行报错问题排查

背景 建索引可能因各种各样的原因产生报错&#xff0c;本文主要介绍碰到建索引报错时&#xff0c;如何定位到建索引报错的日志&#xff0c;方便后续进一步使用工具一键收集日志/根因分析&#xff0c;分析根本原因。 备注&#xff1a;此文档中涉及的语句适用于版本号>4.2.3…

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

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

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

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

ES Master 和data节点分别的职责

目录 Elasticsearch Master 节点 职责 特点 Elasticsearch Data 节点 职责 特点 通俗解释 Elasticsearch Master 节点 职责 集群管理: Master 节点负责整个集群的管理工作&#xff0c;包括集群的配置和控制。元数据管理: 维护集群的状态&#xff0c;包括索引的创建、删…