一、递归介绍
1、定义:函数定义中调用函数自身的方式称为递归。
2、书写递归的2个关键特征:
(1)存在一个或多个基例,基例不需要再次递归,它是确定的表达式;
(2)递归链条,所有递归链条要以一个或多个基例结尾。
(3)书写方式:
通过分支语句来书写。
if 基例条件:
基例语句块
else:
递归链条
二、分步骤讲解分形树,进而用递归实现
1、1阶树
import turtle as t
def tree_1(length): #一阶分形树
t.fd(length) #树干
t.left(30)
t.fd(length) #左树枝
t.bk(length)
t.right(60)
t.fd(length)#右树枝
t.bk(length)
t.left(30)
t.bk(length)#回到根部
t.left(90)
tree_1(100)
t.hideturtle()
t.done()
效果如下:
2、2阶树
def tree_2(length):#二阶分形树
t.fd(length)
t.left(30)
tree_1(length) #调用一阶树
t.right(60)
tree_1(length)#调用一阶树
t.left(30)
t.bk(length)
t.left(90)
tree_2(100)
t.hideturtle()
t.done()
效果如下:
3、3阶树
def tree_3(length):#三阶分形树
t.fd(length)
t.left(30)
tree_2(length)#调用二阶树
t.right(60)
tree_2(length)#调用二阶树
t.left(30)
t.bk(length)
t.left(90)
tree_3(100)
t.hideturtle()
t.done()
效果如下:
4、递归书写分形树(第一种方法)
def tree_4(length):#递归第一种方法 以length为基例条件
if length<=0:#基例,当树枝长度<=0时返回
return
else:
t.fd(length)
t.left(30)
tree_4(length-10)#树枝长度每次减10
t.right(60)
tree_4(length-10)#树枝长度每次减10
if length-10<=0:#树枝<=0时画一个粉色圆点
t.color('pink')
t.dot(10)
t.color('brown')
t.left(30)
t.bk(length)
tree_4(100)
t.hideturtle()
t.done()
效果如下:
5、 递归书写分形树(第二种方法)
def tree_5(length,n):#递归第二种方法,以n为基例条件
if n<0: #基例,以树的阶数为基例,注意n<0不是n<=0
return
else:
t.fd(length)
t.left(30)
tree_5(length-3,n-1) #树枝和树干的长度可以相同,也可以每次减一个数值,树的阶数每次减1
t.right(60)
tree_5(length-3,n-1)#树枝和树干的长度可以相同,也可以每次减一个数值,树的阶数每次减1
if n<=0:
t.color('green')
t.dot(20)
t.color('brown')
t.left(30)
t.bk(length)
t.speed(0)
t.left(90)
t.penup()
t.goto(0,-300)
t.pendown()
tree_5(100,7)
t.hideturtle()
t.done()
6、递归书写分形树(第三种方法)
import turtle as t
def draw_circle():#画粉色圆点
t.pencolor('pink')
t.dot(10)
t.pencolor('brown')
def tree_n1(length,n):
if n==1: #基例,其实就是tree_1
t.fd(length)
t.left(30)
t.fd(length-10)
draw_circle()
t.bk(length-10)
t.right(60)
t.fd(length-10)
draw_circle()
t.bk(length-10)
t.left(30)
t.bk(length)
else:
t.fd(length)
t.left(30)
tree_n1(length-10,n-1)#左枝
t.right(60)
tree_n1(length-10,n-1)#右枝
t.left(30)
t.bk(length)
t.left(90)
tree_n1(100,4)
# tree_n(100)
t.done()
效果跟以上两种方法一样,这种写法更容易理解一些。