05_python_recursive

递归简介

  • 给定一个列,返回所有数的和
    • 全括号表达式
    • 数列的和 = 首个数 + 余下数列的和
def listsum(numlist):
    if len(numlist) == 1:
        return numlist[0]
    else:
        return numlist[0] + listsum(numlist[1:])
print(listsum([1,3,5,7,9]))
25
  • 递归三定律
    • 递归算法必须有一个基本结束条件(最小规模问题的直接解决)
    • 递归算法必须能改变状态向基本结束条件演进(减小问题规模)
    • 递归算法必须调用自身(解决减小了规模的相同问题)

整数转换为任意进制

  • 基本结束条件:小于十的整数
  • 改变状态:整数除(//base),求余数(%base)
  • 调用自身
def toStr(n, base):
    convertString = "0123456789ABCDEF"
    if n < base:   #最小规模
        return convertString[n]
    else:
        return toStr(n//base, base) + convertString[n%base]  #减小规模,调用自身
print(toStr(769, 16))
301

递归图示

turtle module

  • Python的海龟作图系统turtle module
    • Python内置,随时可用,以LOGO语言的创意为基础
    • 爬行:forward(n);backward(n)
    • 转向:left(a);right(n)
    • 抬笔放笔:penup();pendown()
    • 笔属性:pensize(s);pencolor©
import turtle
t = turtle.Turtle()
#作图开始
t.forward(100) #指挥龟作图:一个长度为100像素的单箭头直线
#作图结束
turtle.done()
import turtle
t = turtle.Turtle()
for i in range(4):  #一个边长为100像素的正方形
    t.forward(100)
    t.right(90)
turtle.done()
import turtle
t = turtle.Turtle()

t.pencolor('red')
t.pensize(3)

for i in range(5):   #一个红色五角星
    t.forward(100)
    t.right(144)
t.hideturtle()

turtle.done()
import turtle
t = turtle.Turtle()

def drawSpiral(t, lineLen): #画一个正方螺旋线
    if lineLen > 0:   #最小规模,0直接退出
        t.forward(lineLen)
        t.right(90)
        drawSpiral(t, lineLen - 5)  #减小规模,边长减5;调用自身
drawSpiral(t, 100)
turtle.done()

分形树

  • 分形:自相似递归图形
    • 一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状,即具有自相似的性质。
    • 如海岸线、山脉、闪电、云朵、雪花、树
  • 分形是在不同尺度上都具有相似性的事物
  • 把树分解为三部分:二叉树 = 树干 + 左边倾斜的小树 + 右边倾斜的小树
import turtle

def tree(branch_len):
    if branch_len > 5:  #树干太短不画,即递归结束条件
        t.forward(branch_len)  #画树干
        t.right(20) #右倾斜20度
        tree(branch_len - 15) #递归调用,画右边的小树,树干减15
        t.left(40) #向左回40度,即左倾斜20度
        tree(branch_len - 15) #递归调用,画左边的小树,树干减15
        t.right(20) #向右回20度,即回正
        t.backward(branch_len) #海龟退回原位置
        
t = turtle.Turtle()
t.left(90)
t.penup()
t.backward(100)
t.pendown()
t.pencolor('green')
t.pensize(2)
tree(75) #画树干长度75的二叉树
t.hideturtle()
turtle.done()

谢尔宾斯基Sierpinski三角形

  • 分形构造,平面称谢尔宾斯基三角形,立体称谢尔宾斯基金字塔
    • 真正的谢尔宾斯基三角形是完全不可见的,其面积为0,但周长无穷,是介于一维和二维之间的分数维(约1.585维)构造。
    • 根据自相似特性,谢尔宾斯基三角形是由3个尺寸减半的谢尔宾斯基三角形按照品字形拼叠而成。
    • 无法真正做出谢尔宾斯基三角形(degree->oo)。

  • 在degree有限的情况下,degree=n的三角形,是由3个degree=n-1的三角形按照品字形拼叠而成。
    • 这三个degree=n-1的三角形边长均为degree=n的三角形的一半(规模减小)。
    • 当degree=0,则就是一个等边三角形,这是递归基本结束条件。
import turtle

def sierpinski(degree, points):
    colormap = ['blue', 'red', 'green', 'white', 'yellow', 'orange']
    
    drawTriangle(points, colormap[degree]) #等边三角形
    
    if degree > 0:  #最小规模,0直接退出
        sierpinski(degree - 1,             #减小规模,getMid()边长减半
                  {
   'left':points['left'],
                  'top':getMid(points['left'],points['top']),
                  'right':getMid(points['left'],points['right'])})  #调用自身,左上右次序
        sierpinski(degree - 1,
                  {
   'left':getMid(points['left'], points['top']),
                  'top':points['top'],
                  'right':getMid(points['top'],points['right'])})
        sierpinski(degree - 1,
                  {
   'left':getMid(points['left'], points['right']),
                  'top':getMid(points['top'],points['right']),
                  'right':points['right']
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值