用python画科赫曲线,科赫曲线绘制 python代码
科赫曲线是一种像雪花一样的几何曲线,所以也叫雪花曲线。这是德勒姆曲线的一个特例。本文将使用Python语言实现这条曲线,有需要的可以参考。
00-1010 1.递归1.1定义1.2数学归纳法2。递归的使用2.1阶乘2.2字符串求逆3。绘制科赫曲线3.1轮廓3.2绘制科赫曲线3.3科赫曲线的雪花效果3.4分形几何
目录
1. 递归
作为一个代码包,一个函数可以被其他程序调用,当然也可以被函数内部的代码调用。这种在函数定义中调用函数本身的方式叫做递归。就像一个人站在满是镜子的房间里,他看到的图像是递归的结果。递归在数学和计算机应用中非常强大,可以非常简洁地解决重要问题。
数学上有一个经典的递归例子叫做阶乘,通常定义如下:
n!=n(n- 1)(n- 2)…(1)
为了实现这个程序,可以通过简单的循环累加来计算阶乘。观察5!计算一下,如果去掉5,那么还剩下4!推广方面,n!=n(n-1)!实际上,这个关系式给出了阶乘的另一种表达方式:
当n=0时,n!=1;否则,n!=n(n - 1)!
这个定义说明0的阶乘定义为1,其他数的阶乘定义为这个数的阶乘乘以一个比这个数小的数。递归不是循环,因为每次递归都会计算一个小于它的阶乘,直到0!0!是一个已知值,被称为递归的基本示例。当递归结束后,你需要一个可以直接计算值的表达式。
阶乘的例子揭示了递归的两个关键特征:
(1)有一个或多个基本示例。基本示例不需要再次递归,它是一个明确的表达式。
(2)所有递归链都应该以一个或多个基本示例结束。
1.1 定义
数学归纳法和递归都是利用递归的原理,本质是一样的。数学归纳法在证明一个与自然数有关的命题P(n)时,采用以下步骤。
(1)证明当n取第一值n0时命题成立。
(2)假设当nk (k 0,k为自然数)时命题成立,证明当n=NK ^ 1时命题也成立。
综合(1)和(2),命题P(n)对所有自然数n(n n0)成立。
1.2 数学归纳法
2. 递归的使用方法
以阶乘计算为例,阶乘可以写成单独的函数,函数如下:
定义事实号:
如果n==0:
返回1
else:
返回n *事实(n - 1)
Num=eval(input(请输入整数:))
print(fact(abs(int(num)))
fact()函数在其定义内引用自身,形成一个递归过程(比如第5行)。无限递归会耗尽计算资源,所以需要设计一个基例,使递归逐层返回。fact()函数通过if语句给出了n为0时的基本例子。当n==0时,fact()函数不再递归并返回值1。如果n!=0,递归返回n和n-1阶乘的乘积。
由于负数和小数不能通过减1达到递归的基本示例(n==0),代码的第八行通过abs()和int()函数将用户输入转换为非负整数。这个程序的输出效果如下:3360
请输入一个整数:5。
120
请输入整数:6.789。
720
遵循递归函数的语义,每次调用都会导致一个新函数的开始,表明它有一个局部变量值的副本,包括函数的参数。每次调用函数时,都会临时存储一份函数参数的副本。在递归中,每个函数都会计算自己的参数,互不影响。当基例完成运算并返回值时,每个函数逐层完成运算,并将计算结果返回给调用者。
使用递归时,一定要注意基例的构造,否则递归返回失败就会报错。
2.1 阶乘
对于用户输入的字符串,输出反转的字符串。
/p>
解决这个问题的基本思想是把字符串看作一个递归对象。长字符串由较短字符串组成,每个小字符串也是一个对象。假如把一个字符串看成仅由两部分组成:首字符和剩余字符串。如果将剩余字符串与首字符交换,就完成了反转整个字符串,代码如下:
def reverse(s):return reverse((s[1:]) + s[0])
观察这个函数的工作过程。s[0] 是首字符,s[1:] 是剩余字符串,将它们反向连接,可以得到反转字符串。执行这个程序,结果如下:
def reverse(s):return reverse(s[1:]) + s[0]
reverse("abc")
return reverse(s[1:]) + s[0]
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
这个错误表明系统无法执行 reverse() 函数创建的递归,这是因为 reverse() 函数没有基例,递归层数超过了系统允许的最大递归深度。默认情况下,当递归调用到 1000 层,Python 解释器将终止程序。递归深度是为了防止无限递归错误而设计的,当用户编写的正确递归程序需要超过 1000 层时,可以通过如下代码设定:
import syssys.setrecursionlimit(2000) # 2000 是新的递归层数
reverse() 超过递归深度是因为没有设计基例。字符串反转中的递归调用总是使用比之前更短的字符串,因此,可以把基例设计为字符串的最短形式,即空字符串。
完整代码如下:
def reverse(s):if s == "":
return s
else:
return reverse(s[1:]) + s[0]
str = input("请输入一个字符串:")
print(reverse(str))
程序执行结果如下:
请输入一个字符串:Python程序设计
计设序程nohtyP
3. 科赫曲线的绘制
3.1 概要
这是一个采用递归方法绘制科赫曲线的实例,分形几何采用类似递归的核心思想。
自然界有很多图形很规则,符合一定的数学规律, 例如,蜜蜂的蜂窝是天然的等边六角形等。科赫曲线在众多经典数学曲线中非常著名,由瑞典数学家冯。科赫( H-V-Koch )于 1904 年提出,由于其形状类似雪花,也被称为雪花曲线。
科赫曲线的基本概念和绘制方法如下:
正整数 n 代表科赫曲线的阶数,表示生成科赫曲线过程的操作次数。科赫曲线初始化阶数为 0,表示一个长度为 L 的直线。对于直线 L,将其等分为 3 段,中间一段用边长为 L/3 的等边三角形的两个边替代,得到 1 阶科赫曲线,它包含 4 条线段。进一步对每条线段重复同样的操作后得到 2 阶科赫曲线。继续重复同样的操作 n 次可以得到 n 阶科赫曲线,如下图所示:
3.2 绘制科赫曲线
科赫曲线属于分形几何分支,它的绘制过程体现了递归思想,绘制过程代码如下:
import turtledef koch(size, n):
if n == 0:
turtle.fd(size)
else:
for angle in [0, 60, -120, 60]:
turtle.left(angle)
koch(size / 3, n - 1)
def main():
turtle.setup(800, 400)
turtle.speed(0) # 控制绘制速度
turtle.penup()
turtle.goto(-300, -50)
turtle.pendown()
turtle.pensize(2)
koch(600, 6) # 0阶科赫曲线长度,阶数
turtle.hideturtle()
main()
程序执行结果如下:
n 阶科赫曲线的绘制相当于在画笔前进方向的 0°、60°、-120° 和 60° 分别绘制 n-1 阶曲线。上述代码中 main() 函数设置了一些初始参数,如果希望控制绘制科赫曲线的速度,可以采用 turtle.speed() 函数增加或减少速度。
3.3 科赫曲线的雪花效果
科赫曲线从一条直线绘制开始,如果从倒置的三角形开始将更有趣。替换前面代码中的 main() 函数,代码如下:
import turtledef koch(size, n):
if n == 0:
turtle.fd(size)
else:
for angle in [0, 60, -120, 60]:
turtle.left(angle)
koch(size / 3, n - 1)
def main():
turtle.setup(600, 600)
turtle.speed(1000)
turtle.penup()
turtle.goto(-200, 100)
turtle.pendown()
turtle.pensize(2)
level = 5
koch(400, level)
turtle.right(120)
koch(400, level)
turtle.right(120)
koch(400, level)
turtle.hideturtle()
main()
程序执行结果如下:
3.4 分形几何
分形几何学是数学的一个分支,以不规则几何形态为研究对象。分形以自相似结构为基础,通过无限递归方式展示复杂表面下的内在数学秩序。分形几何不仅展示了数学之美,也揭示了世界的本质,使人们重新审视这个世界:世界是非线性的,分形无处不在。
到此这篇关于详解如何利用Python绘制科赫曲线的文章就介绍到这了,更多相关Python科赫曲线内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。