- C++
Python lv2 函数的应用-递归
- 2024-5-26 12:10:12 @
重点:理解递归
1、递归的本质是:函数直接或者间接的调用自己
2、使用递归的时候,要小心死循环
3、防止死循环,要设置递归的退出条件
4、使用递归算法绘制风形图像
谢尔宾斯基三角形
谢尔宾斯基三角形是由波兰数学家谢尔宾斯基(Wacław Sierpiński)在1915年首次发现并研究的分形图形之一。它是通过一个等边三角形不断地分割成四个小三角形而得到的。具体的构造过程是:在等边三角形的每个边上取一个点,然后连接这些点,得到四个小的等边三角形。接着,把中间那个小三角形去掉,再在剩下的三个小三角形中重复上述操作,如此不断重复下去,就可以得到越来越多的三角形,最终形成一个美丽的谢尔宾斯基三角形。
谢尔宾斯基三角形的构造方法不仅简单而且具有很多有趣的数学性质,比如它的面积为原等边三角形的1/4,它的周长是无限的,它是一个自相似的图形等等。由于这些性质以及其美丽的外观,谢尔宾斯基三角形成为了分形几何学中最为著名的图形之一。它的研究对于发展现代分形理论和计算机图形学都有着重要的意义。
分形与递归
分形几何和递归算法是紧密相关的,因为递归算法是分形几何的核心原理之一。
分形几何是一种研究自相似结构和重复规律的几何学。分形图形通常是由一个基本形状不断变换和重复而成的。这些形状可以是点、线段、三角形、四边形、圆等等。通过这种不断重复和变换的过程,可以得到具有非整数维度的几何形状,这些形状具有无限的细节和复杂性。
而递归算法是实现分形几何的重要手段之一。递归算法是一种自相似的算法,它通过在函数内部不断地调用自己来实现问题的解决。在分形几何中,递归算法通常用来实现图形的重复和变换。通过递归算法,可以将一个大的图形分解成许多小的子图形,然后对每个子图形进行相同的操作,最终得到整个分形图形。
例如,在绘制谢尔宾斯基三角形时,我们可以使用递归算法来不断地将一个大的等边三角形分割成三个小的等边三角形,然后对于每个小的等边三角形,再次使用同样的算法进行分割,直到达到所需的层数为止。这种递归分割的过程实现了谢尔宾斯基三角形的构造。
import turtle
# 定义函数,用于绘制三角形
def draw_triangle(points, color, t):
t.fillcolor(color)
t.up()
t.goto(points[0][0], points[0][1])
t.down()
t.begin_fill()
t.goto(points[1][0], points[1][1])
t.goto(points[2][0], points[2][1])
t.goto(points[0][0], points[0][1])
t.end_fill()
# 定义函数,用于计算两个点的中点坐标
def get_mid(p1, p2):
return ((p1[0]+p2[0])/2, (p1[1]+p2[1])/2)
# 定义函数,用于绘制谢尔宾斯基三角形
def sierpinski(points, degree, t):
# 颜色列表,最多支持7个不同颜色
colormap = ['blue', 'red', 'green', 'white', 'yellow', 'violet', 'orange']
# 根据深度 degree 绘制三角形,填充颜色使用 colormap[degree] 对应的颜色
draw_triangle(points, colormap[degree], t)
# 如果深度 degree 大于 0,递归绘制谢尔宾斯基三角形
if degree > 0:
# 绘制三个子三角形,每个子三角形深度比原三角形少 1
# 三个子三角形的顶点分别为原三角形的第一个点和另外两个点的中点,第二个点和第一个点与第三个点的中点,第三个点和第一个点与第二个点的中点
sierpinski([points[0], get_mid(points[0], points[1]), get_mid(points[0], points[2])], degree-1, t)
sierpinski([points[1], get_mid(points[0], points[1]), get_mid(points[1], points[2])], degree-1, t)
sierpinski([points[2], get_mid(points[2], points[1]), get_mid(points[0], points[2])], degree-1, t)
# 初始化 turtle 绘图窗口
t = turtle.Turtle()
myWin = turtle.Screen()
t.speed(0) # 设置绘图速度,0 最快
t.ht() # 隐藏画笔
# 定义三角形的三个顶点,可以根据需要修改三角形大小和位置
points = [[-200,-100],[0,200],[200,-100]]
# 绘制谢尔宾斯基三角形,深度为 4,即递归 4 层
sierpinski(points, 4, t)
# 点击关闭窗口
myWin.exitonclick()