递归简介
- 给定一个列,返回所有数的和
- 全括号表达式
- 数列的和 = 首个数 + 余下数列的和
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)
turtle.done()
import turtle
t = turtle.Turtle()
for i in range(4):
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:
t.forward(lineLen)
t.right(90)
drawSpiral(t, lineLen - 5)
drawSpiral(t, 100)
turtle.done()
分形树
- 分形:自相似递归图形
- 一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状,即具有自相似的性质。
- 如海岸线、山脉、闪电、云朵、雪花、树
- 分形是在不同尺度上都具有相似性的事物
- 把树分解为三部分:二叉树 = 树干 + 左边倾斜的小树 + 右边倾斜的小树
import turtle
def tree(branch_len):
if branch_len > 5:
t.forward(branch_len)
t.right(20)
tree(branch_len - 15)
t.left(40)
tree(branch_len - 15)
t.right(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)
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:
sierpinski(degree - 1,
{
'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']