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

【我和Python算法的初相遇】——体验递归的可视化篇

🌈个人主页: Aileen_0v0
🔥系列专栏:PYTHON数据结构与算法学习系列专栏
💫"没有罗马,那就自己创造罗马~" 

目录

递归的起源

什么是递归?

 利用递归解决列表求和问题

递归三定律

递归应用-整数转换为任意进制数

递归可视化 

画一个正方形 

画一个五角星 

画一个九边形 

画圆形

画一个等腰三角形 

利用递归画一个螺旋 

利用递归画一颗分形树 

利用递归画一个谢尔平斯基三角形


递归的起源

递归是一种算法,它利用函数的自身调用来解决问题。递归的历史可以追溯到古代的数学家和逻辑学家,如希腊哲学家亚里士多德和印度数学家阿耶尔巴塔。然而,递归算法的实际应用可以追溯到早期的计算机科学,尤其是在20世纪40年代和50年代的计算机发展初期。

在20世纪初,数学家David Hilbert提出了“希尔伯特问题”,其中包括一个著名的问题——哥德尔不完备定理。这个定理表明,任何一个形式化的系统都无法证明自身完备。这导致了一些数学家开始研究递归函数,因为递归函数是一种强大的工具,可以用来刻画数学中的可计算性概念。在20世纪40年代,递归理论被广泛研究,它为计算机科学的发展奠定了基础。

早期计算机(如ENIAC)是通过执行单个指令来执行操作的,因此递归算法在这些机器上的执行效率较低。然而,随着计算机硬件和编程语言的发展,递归算法变得更加普遍和有效。今天,递归算法被广泛用于计算机科学中的许多应用领域,如数据结构设计、图像处理、机器学习和自然语言处理。


什么是递归?

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

问题:

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

def Listsum(nl):sum = 0for i in nl:sum += ireturn sumprint(Listsum([1,2,3,4]))

 利用递归解决列表求和问题


程序很简单,但假如没有循环语句 ?既不能用for,也不能用while还能对不确定长度的列表求和么?

 


递归三定律

1.结束条件

2.向基态前进

3.自己调用自己


递归应用-整数转换为任意进制数

我们用最熟悉的十进制分析下这个问题

十进制有十个不同符号: convString =0123456789"
比十小的整数,转换成十进制
直接查表就可以了: convString[n] 

比十大的整数想办法把比十大的整数拆成一系列比十小的整数,逐个查表
比如七百六十九,拆成七、六、九,查表得到769就可以了

所以,在递归三定律里,我们找到了“,就是小于十的整数本结束条件”

拆解整数的过程就是向“基本结束条件”演进的过程
我们用整数除,和求余数两个计算来
将整数一步步拆开除以“进制基base(// base)对“进制基”求余数 (% base)

#n为转换的数字   base为进制数
def tostring(n,base):coverstring = "0123456789"if n < base :return coverstring[n]else:return tostring(n // base , base) + coverstring[n % base]
print(tostring(1999,10))


递归可视化 


画一个正方形 

import turtle
t = turtle.Turtle()
#通过四次向右转90度画一个边长为100的正方形
for i in range(4):t.forward(100)t.right(90)
turtle.done()

 

画一个五角星 

#画五角星
import turtle
t = turtle.Turtle()
t.pencolor("red")
t.pensize(3)
for i in range(5):t.forward(100)t.right(144)
t.hideturtle()turtle.done()


画一个九边形 

#画九边形
import turtle
t = turtle.Turtle()
t.pencolor("blue")
t.pensize(10)
for i in range(9):t.forward(100)t.left(320)
t.hideturtle()
turtle.done()


画圆形

#画圆形
import turtle
t = turtle.Turtle()
t.pencolor("blue")
t.pensize(10)
for i in range(1):t.circle(180)
t.hideturtle()
turtle.done()


画一个等腰三角形 

#画等腰三角形
import turtle
t = turtle.Turtle()
t.pencolor("blue")
t.pensize(10)
for i in range(4):t.forward(100)t.left(120)
t.hideturtle()
turtle.done()


利用递归画一个螺旋 

#内置库,用于画图的模块
import turtle
#实例化turtle对象
my_turtle = turtle.Turtle()
#调用窗口
my_win = turtle.Screen()def draw_spiral(my_turtle,line_len):if line_len > 0:# 向当前方向走line_len 个像素my_turtle.forward(line_len)#箭头向右转90度my_turtle.left(90)#调用自己draw_spiral(my_turtle,line_len - 5)#♥这个图告诉我们递归不一定要有返回值
draw_spiral(my_turtle,300)
my_win.exitonclick()


利用递归画一颗分形树 

def tree(branch_len, t):if branch_len > 5:t.forward(branch_len)t.right(20)tree(branch_len-15, t)t.left(40)tree(branch_len-15, t)t.right(20)t.backward(branch_len)import turtle
t = turtle.Turtle()
my_win = turtle.Screen()
t.left(90)
t.up()
t.backward(200)
t.down()
t.color("black")
tree(110,t)
my_win.exitonclick()

 


利用递归画一个谢尔平斯基三角形

#绘制谢尔平斯基三角形的辅助函数
import turtle
def draw_triangle(points , color, my_turtle ):my_turtle.fillcolor ( color )my_turtle.up()my_turtle.goto(points[0][0],points[0][1])my_turtle.down()my_turtle.begin_fill()my_turtle.goto(points[1][0],points [1][1])my_turtle.goto(points[2][0],points [2][1])my_turtle.goto(points[0][0],points [0][1])my_turtle.end_fill()def get_mid(p1,p2 ):return ((p1[0] + p2[0]) / 2 , (p1[1] + p2[1]) / 2)# 绘制谢尔平斯基三角形
def sierpinski(points, degree, my_turtle):colormap = ["blue","red","green","white","yellow","violet","orange",]draw_triangle(points, colormap[degree], my_turtle)if degree > 0:sierpinski([points[0],get_mid(points[0], points[1]),get_mid(points[0], points[2]),],degree - 1,my_turtle,)sierpinski([points[1],get_mid(points[0],points[1]),get_mid(points[1],points[2]),],degree - 1,my_turtle,)sierpinski([points[2],get_mid(points[2],points[1]),get_mid(points[0],points[2]),],degree - 1,my_turtle,)def main():my_turtle = turtle.Turtle()my_win = turtle.Screen()my_points =  [[-100,-50],[0,100],[100,-50]]sierpinski(my_points, 5, my_turtle)my_win.exitonclick()print(main())

 

📝全文总结

本文主要讲解:
    本文主要讲解了递归的历史起源以及使用规则 —— 我们通过递归可以将复杂问题简单化,并且我们还学习了如何通过递归进行进制转换,以及如何通过递归去画出我们想要的图形---螺旋图,分形树,谢尔基三角形。

     今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,Aileen的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就我前进的最大动力!

 

相关文章:

【我和Python算法的初相遇】——体验递归的可视化篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:PYTHON数据结构与算法学习系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 递归的起源 什么是递归? 利用递归解决列表求和问题 递归三定律 递归应用-整数转换为任意进制数 递归可视化 画…...

【C语言的秘密】密探—深究C语言中多组输入的秘密!

场景引入&#xff1a; 你是否在刷题过程中&#xff0c;经常遇到以下场景呢&#xff1f; 场景一&#xff1a; 场景二&#xff1a; 从这些题上都能看见输入描述中提出了一条多组输入&#xff0c;那啥是多组输入&#xff1f;如何实现它呢&#xff1f; 多组输入&#xff1a;在输入…...

ClickHouse 语法优化规则

ClickHouse 的 SQL 优化规则是基于RBO(Rule Based Optimization)&#xff0c;下面是一些优化规则 1 准备测试用表 1&#xff09;上传官方的数据集 将visits_v1.tar和hits_v1.tar上传到虚拟机&#xff0c;解压到clickhouse数据路径下 // 解压到clickhouse数据路径 sudo tar -xvf…...

3-运行第一个docker image-hello world

CentOS7.9下安装完成docker后,我们开始部署第一个docker image-hello world 1.以root用户登录CentOS7.9服务器,拉取centos7 images 命令: docker pull hello-world [root@centos79 ~]# docker pull hello-world Using default tag: latest latest: Pulling from library…...

【漏洞复现】泛微e-Weaver SQL注入

漏洞描述 泛微e-Weaver&#xff08;FANWEI e-Weaver&#xff09;是一款广泛应用于企业数字化转型领域的集成协同管理平台。作为中国知名的企业级软件解决方案提供商&#xff0c;泛微软件&#xff08;广州&#xff09;股份有限公司开发和推广了e-Weaver平台。 泛微e-Weaver旨在…...

「git 系列」git 如何存储代码的?

这里写自定义目录标题 git 文件存储位置git 数据模型示例分析分析前准备命令哈希值 具体示例 不同版本的提交&#xff0c;git 做了什么工作&#xff1f;snapshot vs delta-based vs backup参考资料 git 文件存储位置 想要了解如何存储&#xff0c;首先需要知道存储位置。 当我…...

IDEA 集成 Docker 插件一键部署 SpringBoot 应用

目录 前言IDEA 安装 Docker 插件配置 Docker 远程服务器编写 DockerFileSpringBoot 部署配置SpringBoot 项目部署结语 前言 随着容器化技术的崛起&#xff0c;Docker成为了现代软件开发的关键工具。在Java开发中&#xff0c;Spring Boot是一款备受青睐的框架&#xff0c;然而&…...

IDEA无法查看源码是.class,而不是.java解决方案?

问题&#xff1a;在idea中&#xff0c;ctrl鼠标左键进入源码&#xff0c;但是有时候会出现无法查看反编译的源码&#xff0c;如图&#xff01; 而我们需要的是方法1: mvn dependency:resolve -Dclassifiersources 注意&#xff1a;需要该模块的目录下&#xff0c;不是该文件目…...

机器视觉系统选型-定光照强度

同一个外形结构的光源&#xff0c;光照强度受如下影响&#xff1a; 单颗灯珠的亮度灯珠排列的数量和密度漫射板/防护板的材质&#xff08;透明、半透明、全漫射&#xff09; 在合理范围内提升光照强度&#xff0c;可降低对相机曝光时长的要求 外形结构尺寸相同的两款光源&am…...

ChatGLM3-6B:新一代开源双语对话语言模型,流畅对话与低部署门槛再升级

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…...

StoneDB顺利通过中科院软件所 2023 开源之夏 结项审核

近日&#xff0c;中科院软件所-开源软件供应链点亮计划-开源之夏2023的结项名单正式出炉&#xff0c;经过三个月的项目开发和一个多月的严格审核&#xff0c;共产生 418个成功结项项目&#xff01;其中&#xff0c;StoneDB 作为本次参与开源社区&#xff0c;社区入选的两个项目…...

Linux本地docker一键部署traefik+内网穿透工具实现远程访问Web UI管理界面

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…...

SpringCloud FeignClient声明式服务调用采坑记录(A调用服务B/C,B/C重启后必须重启A后才能成功调用配置项)

SpringCloud FeignClient声明式服务调用&#xff08;A调用服务B/C&#xff0c;B/C重启后必须重启A后才能成功调用配置项采坑记录&#xff09; 1. 报错&#xff08;info级别的警告信息&#xff09;2. 原因&#xff1a;使用了默认了cache负载均衡&#xff0c;或者禁用了ribbonLoa…...

安装银河麒麟linux系统docker(docker-compose)环境,注意事项(一定能解决,有环境资源)

1&#xff1a;安装docker环境必须使用麒麟的版本如下 2&#xff1a;使用docker-compse up -d启动容器遇到的文件 故障1&#xff1a;如果运行docker-compose up 报“Cannot create redo log files because data files are corrupt or the database was not shut down cleanly a…...

BUG:编写springboot单元测试,自动注入实体类报空指针异常

原因:修饰测试方法的Test注解导入错误 造成错误的原因是 import org.junit.Test;正确的应该是 import org.junit.jupiter.api.Test前者是Junit4,后者是Junit5 junit4的使用似乎要在测试类除了添加SpringbootTest还要添加RunWith(SpringRunner.class) 同时要注意spring-boot-s…...

深度解析 InterpretML:打开机器学习模型的黑箱

深度解析 InterpretML&#xff1a;打开机器学习模型的黑箱 机器学习模型的高性能往往伴随着模型的复杂性&#xff0c;这使得模型的决策过程变得不透明&#xff0c;难以理解。在这个背景下&#xff0c;可解释性机器学习成为了一个备受关注的领域。本文将介绍 InterpretML&#…...

数据结构初阶leetcodeOJ题(二)

目录 第一题 思路&#xff1a; 第二题 思路 第三题 描述 示例1 思路 总结&#xff1a;这种类似的题&#xff0c;都是用快慢指针&#xff0c;相差一定的距离然后输出慢指针。 第一题 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val…...

若依框架数据源切换为pg库

一 切换数据源 在ruoyi-admin项目里引入pg数据库驱动 <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.18</version> </dependency>修改配置文件里的数据源为pg spring:d…...

java 访问sqlserver 和 此驱动程序不支持jre1.8错误

sqlserver数据如下&#xff1b; TestSQL.java&#xff1b; import java.sql.*;public class TestSQL {public static void main(String[] args) throws ClassNotFoundException, SQLException {String driverName "com.microsoft.sqlserver.jdbc.SQLServerDriver";…...

C/C++字符判断 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C字符判断 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C字符判断 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 对于给定的字符&#xff0c;如果该字符是大小写字母或…...

Applied Intelligence投稿实战:从格式要求到高接受率的5个关键策略

1. 精准匹配期刊范围&#xff1a;避免编辑秒拒的第一道防线 投稿Applied Intelligence期刊时&#xff0c;最容易被忽视却最关键的一步就是研究范围匹配。我审过30篇稿件&#xff0c;发现80%的"desk rejection"&#xff08;编辑直接拒稿&#xff09;都源于研究方向与…...

Android USB串口通信终极指南:智能家居物联网项目实战

Android USB串口通信终极指南&#xff1a;智能家居物联网项目实战 【免费下载链接】usb-serial-for-android Android USB host serial driver library for CDC, FTDI, Arduino and other devices. 项目地址: https://gitcode.com/gh_mirrors/us/usb-serial-for-android …...

如何永久保存微信聊天记录:免费工具实现数据可视化与年度报告生成

如何永久保存微信聊天记录&#xff1a;免费工具实现数据可视化与年度报告生成 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendi…...

STM32F103红外小车避坑指南:从Proteus仿真失败到实物调试成功

STM32F103红外小车避坑指南&#xff1a;从Proteus仿真失败到实物调试成功 第一次尝试用STM32F103做红外循迹小车时&#xff0c;我花了整整三天时间在Proteus里调试仿真&#xff0c;结果连最基本的电机转动都实现不了。直到把电路搬到实物上&#xff0c;才发现仿真环境里那些看似…...

3步解锁音乐自由:NCMDump帮你破解网易云音乐NCM格式

3步解锁音乐自由&#xff1a;NCMDump帮你破解网易云音乐NCM格式 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为下载的网易云音乐只能在特定App里播放而烦恼吗&#xff1f;当你精心挑选的歌单无法在车载音响、运动手表或家庭音…...

3个创新方法:用Krita AI Diffusion插件实现智能动画制作

3个创新方法&#xff1a;用Krita AI Diffusion插件实现智能动画制作 【免费下载链接】krita-ai-diffusion Streamlined interface for generating images with AI in Krita. Inpaint and outpaint with optional text prompt, no tweaking required. 项目地址: https://gitco…...

开源工具SMUDebugTool:系统优化与性能调优的终极解决方案

开源工具SMUDebugTool&#xff1a;系统优化与性能调优的终极解决方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:/…...

Fay数字人框架终极指南:30分钟打造你的AI虚拟助手

Fay数字人框架终极指南&#xff1a;30分钟打造你的AI虚拟助手 【免费下载链接】Fay Fay 是一个开源的数字人类框架&#xff0c;集成了语言模型和数字字符。它为各种应用程序提供零售、助手和代理版本&#xff0c;如虚拟购物指南、广播公司、助理、服务员、教师以及基于语音或文…...

AEC-Q100到AEC-Q200:汽车电子组件认证标准差异与应用场景详解

AEC-Q100到AEC-Q200&#xff1a;汽车电子组件认证标准差异与应用场景详解 当一辆现代汽车驶过零下40度的北极圈&#xff0c;又穿越50度的沙漠高温&#xff0c;其电子系统仍需要保持毫秒级的响应精度——这种极端可靠性背后&#xff0c;是AEC-Q系列认证标准构筑的质量防线。作为…...

避坑指南:GF-3 SAR数据预处理中常见的5个错误及解决方法

GF-3 SAR数据预处理实战&#xff1a;5个关键错误分析与Python解决方案 在遥感数据处理领域&#xff0c;GF-3卫星的合成孔径雷达(SAR)数据因其全天候、全天时的观测能力而备受青睐。然而&#xff0c;从原始数据到可用成果的预处理过程中&#xff0c;即便是经验丰富的工程师也常会…...