递归讲解-分形树(python版:三种书写方法)

一、递归介绍

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()

效果跟以上两种方法一样,这种写法更容易理解一些。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值