详解如何利用Python绘制科赫曲线

目录
  • 1. 递归
    • 1.1 定义
    • 1.2 数学归纳法
  • 2. 递归的使用方法
    • 2.1 阶乘
    • 2.2 字符串反转
  • 3. 科赫曲线的绘制
    • 3.1 概要
    • 3.2 绘制科赫曲线
    • 3.3 科赫曲线的雪花效果
    • 3.4 分形几何

1. 递归

1.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,其他数字的阶乘定义为这个数字乘以比这个数字小 1 数的阶乘。递归不是循环,因为每次递归都会计算比它更小数的阶乘,直到 0!。0! 是已知的值,被称为递归的基例。当递归到底了,就需要一个能直接算出值的表达式。

阶乘的例子揭示了递归的两个关键特征:

(1) 存在一个或多个基例,基例不需要再次递归,它是确定的表达式。

(2) 所有递归链要以一个或多个基例结尾。

1.2 数学归纳法

数学归纳法和递归都利用了递推原理,本质是相同的。在证明一个与自然数相关的命题 P(n) 时,数学归纳法采用如下步骤。

(1) 证明当 n 取第一个值 n0 时命题成立。

(2) 假设当 nk ( k ≥ 0, k 为自然数 ) 时命题成立,证明当 n=nk+1 时命题也成立。

综合 (1) 和 (2),对一切自然数 n( n ≥ n0),命题 P(n) 都成立。

2. 递归的使用方法

2.1 阶乘

以阶乘计算为例,可以把阶乘写成一个单独的函数,则该函数如下所示:

def fact(n):
    if n == 0:
        return 1
    else:
        return n * fact(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), 代码第 8 行通过 abs() 和 int() 函数将用户输入转变成非负整数,该程序输出效果如下:

请输入一个整数:5

120

请输入一个整数:6.789

720

递归遵循函数的语义,每次调用都会引起新函数的开始,表示它有本地变量值的副本,包括函数的参数。每次函数调用时,函数参数的副本会临时存储,递归中各函数再运算自己的参数,相互没有影响。当基例结束运算并返回值时,各函数逐层结束运算,向调用者返回计算结果。

使用递归一定要注意基例的构建,否则递归无法返回将会报错。

2.2 字符串反转

对于用户输入的字符串 s,输出反转后的字符串。

解决这个问题的基本思想是把字符串看作一个递归对象。长字符串由较短字符串组成,每个小字符串也是一个对象。假如把一个字符串看成仅由两部分组成:首字符和剩余字符串。如果将剩余字符串与首字符交换,就完成了反转整个字符串,代码如下:

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 sys
sys.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 turtle
def 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 turtle

def 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科赫曲线内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python编程利用科赫曲线实现三维飘雪效果示例过程

    目录 随机雪花 科赫雪花 三维 随机雪花 如果随机生成一些点,然后为每个点绘制一些枝杈,则可以画出类似蒲公英这种结构,只是看上去不太好看而已 import numpy as np import matplotlib.pyplot as plt from numpy.random import rand,randint M,N = 10,100 x = rand(N)*100 y = rand(N)*100 plt.scatter(x,y,marker='.') for i in range(N)

  • python绘制浅色范围曲线的示例代码

    借鉴:python绘制lost(损失)曲线 加 方差范围 直接上效果图: 上代码: import re import seaborn as sns import matplotlib.pyplot as plt import matplotlib.cm as cm import shutil import os import math sns.set_style('whitegrid') path=r"F:\pycharm\class\20211008\alexnet_7class_srcDat

  • Python+matplotlib实现简单曲线的绘制

    目录 一.安装matplotlib 二.测试 matplotlib 三. 绘制简单的折线 四.使用 scatter() 绘制散点图并设置其样式 1.要绘制单个点 2.要绘制系列点 3.自动计算数据 4.自动保存图表 一.安装matplotlib 1)由于已安装anaconda,可直接打开anaconda prompt,再用命令pip install matplotlib进行安装,因镜像问题,可能较慢,建议第2种方式. 2)访问https://pypi.org/project/matplotlib

  • Python中ROC曲线绘制

    首先以支持向量机模型为例 先导入需要使用的包,我们将使用roc_curve这个函数绘制ROC曲线! from sklearn.svm import SVC from sklearn.metrics import roc_curve from sklearn.datasets import make_blobs from sklearn. model_selection import train_test_split import matplotlib.pyplot as plt %matplot

  • python入门turtle库实现螺旋曲线图的方法示例

    记录turtle库中经常用到的函数. turtle.forward(distance)  画笔向前移动distance距离 turtle.backforward(distance)  画笔向后移动distance距离 turtle.right(degree)  绘制方向向右旋转degree度 turtle.exitonclick()  点击关闭图形窗口 turtle.penup()   抬起画笔,之后移动画笔不绘制形状 turtle.pendown()  落下画笔,之后移动画笔绘制形状 turt

  • 详解如何利用Python绘制科赫曲线

    目录 1. 递归 1.1 定义 1.2 数学归纳法 2. 递归的使用方法 2.1 阶乘 2.2 字符串反转 3. 科赫曲线的绘制 3.1 概要 3.2 绘制科赫曲线 3.3 科赫曲线的雪花效果 3.4 分形几何 1. 递归 1.1 定义 函数作为一种代码封装, 可以被其他程序调用,当然,也可以被函数内部代码调用.这种函数定义中调用函数自身的方式称为递归.就像一个人站在装满镜子的房间中,看到的影像就是递归的结果.递归在数学和计算机应用上非常强大,能够非常简洁地解决重要问题. 数学上有个经典的递归例

  • 详解如何利用Python绘制迷宫小游戏

    目录 构思 绘制迷宫 走出迷宫 完整代码 更大的挑战 关于坐标系设置 周末在家,儿子闹着要玩游戏,让玩吧,不利于健康,不让玩吧,扛不住他折腾,于是想,不如一起搞个小游戏玩玩! 之前给他编过猜数字 和 掷骰子 游戏,现在已经没有吸引力了,就对他说:“我们来玩个迷宫游戏吧.” 果不其然,有了兴趣,于是和他一起设计实现起来,现在一起看看我们是怎么做的吧,说不定也能成为一个陪娃神器~ 先一睹为快: 构思 迷宫游戏,相对比较简单,设置好地图,然后用递归算法来寻找出口,并将过程显示出来,增强趣味性. 不如想

  • 详解如何利用Python实现报表自动化

    目录 Excel的基本组成 一份自动化报表的流程 报表自动化实战 当日各项指标的同环比情况 当日各省份创建订单量情况 最近一段时间创建订单量趋势 将不同的结果进行合并 本篇文章将带你了解报表自动化的流程,并教你用Python实现工作中的一个报表自动化实战,篇幅较长,建议先收藏,文章具体的目录为: 1.Excel的基本组成 2.一份报表自动化的流程 3.报表自动化实战 - 当日各项指标同环比情况 - 当日各省份创建订单量情况 - 最近一段时间创建订单量趋势 4.将不同的结果进行合并 - 将不同结果

  • 详解如何利用Python制作24点小游戏

    目录 先睹为快 游戏规则(改编自维基百科) 逐步实现 Step1:制作24点生成器 Step2:定义游戏精灵类 Step3:实现游戏主循环 先睹为快 24点 游戏规则(改编自维基百科) 从1~10这十个数字中随机抽取4个数字(可重复),对这四个数运用加.减.乘.除和括号进行运算得出24.每个数字都必须使用一次,但不能重复使用. 逐步实现 Step1:制作24点生成器 既然是24点小游戏,当然要先定义一个24点游戏生成器啦.主要思路就是随机生成4个有解的数字,且范围在1~10之间,代码实现如下:

  • 详解如何利用JavaScript绘制堆叠柱状图

    效果图 this.state.workChartList的数据结构 const workChartList = [ { name: "居民热线", chartData: [5, 8, 8, 7, 0, 5, 6, 5, 9, 5, 4, 7] }, { name: "日常调度类", chartData: [5, 6, 8, 8, 5, 8, 5, 9, 8, 7, 3, 6] }, { name: "调度预警类", chartData: [6,

  • 详解如何利用Python拍摄延时摄影

    目录 前言 准备 定时"拍摄" 拼接延时摄影视频 前言 这个时代,随着游戏引擎技术的快速发展,游戏画面越来越精美,许多人迷上了游戏内的角色.场景. 尤其是端游,显卡技术能够支撑精美的游戏画面,最有名的莫过于<地平线>系列游戏. 使用Python拍摄的<地平线4>延时摄影作品 很多玩家希望拍摄这些精美游戏中的画面,尤其是希望能拍摄到游戏内不同时刻的画面,为了满足这个需求,我们就需要用上延时摄影.游戏内的时间过得比现实世界更快,一个小时内可能你就能经历白天的夜晚的变

  • 基于python绘制科赫雪花

    什么是科赫曲线 科赫曲线是de Rham曲线的特例.给定线段AB,科赫曲线可以由以下步骤生成: 将线段分成三等份(AC,CD,DB) 以CD为底,向外(内外随意)画一个等边三角形DMC 将线段CD移去 分别对AC,CM,MD,DB重复1~3. 什么是科赫雪花 三段科赫曲线组成的图形 实现的效果 < #KocheDraw1 import turtle def koch(size,n): if n==1: turtle.fd(size) else: for i in [0,60,-120,60]:

  • Python绘制二维曲线的日常应用详解

    使用Python绘制出类似Excel或者MATLAB的曲线还是比较容易就能够实现的,需要用到的额外库有两个,numpy和matplotlib.使用这两个模块实现的曲线绘制其实在一定程度上更像是MATLAB的plot功能,不过今天看了一下matplotlib网站上的信息,现在的功能更为强劲了,而且已经支持三维图像的绘制. 模块库的安装非常简单,我使用的Mac,在Mac上用pip进行了两个模块库的安装都十分顺畅.相信其他平台基本上也都这样,如果能够联网,这种安装方式是十分推荐的,确实是简单. 我用P

  • 利用Python绘制一个可爱的米老鼠

    目录 一.效果展示 二.代码详解 1.导入库 2.播放音乐 3.画米老鼠头部外轮廓 4.画衣服和耳朵 5.画眼睛.鼻子.嘴 杨紫和肖战的<余生请多指教>于3月15日起腾讯视频全网独播,湖南卫视金鹰独播剧场晚8:20播放.对于杨紫的纯剧粉(战长沙入的坑图片),想要用Python制作一份独特的宣传视频. 一.效果展示 在介绍代码之前,先来看下本文的实现效果. 视频链接  二.代码详解 python绘制米老鼠的原理是:应用turtle库首先绘制头的外轮廓,然后绘制耳朵.手.衣服.裤子.脚.鞋子等不同

随机推荐