半个月以来,我一直在mooc上听嵩天老师的python课,讲的确实挺好,浅显易懂。到递归这一章了,我脑子开始反应不过来了。于是今天花费一早上的时间琢磨科赫雪花,半知半解。
要想绘制科赫雪花,我们首先要绘制科赫曲线,要想绘制科赫曲线,就得先导入turtle库(doge)如下:
import turtle#导入turtle库
def koch(size,n):#定义一个函数,size表示曲线长度,n表示曲线阶数
if n==0:
turtle.fd(size)
else:
for angle in [0,60,-120,60]:
turtle.left(angle)
koch(size/3,n-1)#递归操作,套娃
koch(300,1)#调用函数
然后你就可以得到一个一阶科赫曲线,如图:
简单修改参数,就可以变成二阶、三阶曲线
曲线已经画完,接下来,我们只需要把线转个弯,乘个三,不就变成雪花了吗?
转个弯简单,我们只需要添加代码:
turtle.seth(n)#n为角度,逆时针为正,顺时针为负
那么,重复三次就可以啦!
怎么重复呢?
循环(大声)!
那么循环怎么和递归写在一起呢?于是经过了一早上的思考,我写出了如下bug(苦笑):
import turtle
def koch(l,size,n):
if n==0:
turtle.fd(size)
else:
turtle.pendown() if l else t.penup()
for angle in [0,60,-120,60]:
turtle.left(angle)
koch(l,size/3,n-1)
turtle.right(120) #120,60,-60,-120
def local():
for i in range(3):
if i>3:
break
else:
koch(True,1200,3)
def main():
turtle.setup(800,800)
turtle.penup()
#turtle.hideturtle()
turtle.speed(9)
turtle.goto(100,100)
turtle.pendown()
turtle.pensize(5)
local()
turtle.hideturtle()
turtle.done()
main()
说实话,写完这段bug,我自己都不认为他能跑起来(无奈),问题不大,我啪的一下,就一个ctrl+s保存,F5运行。万万没想到啊,他竟然没有报错直接开始画了(震惊)!
惊喜之余,我发现它画的雪花有点怪,是这样子的:
这跟需求就不一样了呀!我要的明明是这种:
而且这段bug会陷入一个死循环,海龟会一直在轨迹上运动,这不把海龟累死!
爱护动物的我立马按下了ctrl+c,好让海龟停下来休息。
CPU:你礼貌吗?明明一直是我在运行啊喂,关海龟什么事!
失败了,需求不对,但没有完全失败,毕竟我们还得到了一个新鲜出炉的bug不是吗?
我尝试修改,想了想,拉倒吧,毕竟这个程序就靠这个bug运行,改了还怎么运行?
思索良久,我决定改一改角度,就是如上代码块中注释的部分,不改不知道,一改吓一跳,雪花变成了其他奇怪的样子——
turtle.right(60)
turtle.right(-120)
貌似除了比上一个小了一点,没有神魔区别
turtle.right(-60)
竟然还有点好看!
以上bug无一例外全部陷入死循环(无奈)
不忘初心的我,决定看看老师怎么重复三次,以完成最开始的需求。于是我下载了老师的代码,不看不知道,一看我差点想给自己两巴掌:老师的代码简单明了,也没有for循环,仅仅是简单重复了三次,完成了我们的需求——
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.penup()
turtle.goto(-200, 100)
turtle.pendown()
turtle.pensize(2)
level=3
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.hideturtle()
main()
看了老师的代码,再看看我写的,🐕都摇头
bug是早上写的,文章是晚上发的。直到现在,我都不知道这个bug怎么改。