基于python数据结构与算法(四)——递归

一. 递归思想:

将问题分解为规模更小的去解决
举个例子:

案例一:递归实现任意进制的转化

def toStr(n,base):
	convertString = "0123456789ABCDEF"
	if n < base:
		return convertString[0]
	else:
		return toStr(n//base,base) + convertString[n%base]

print(toStr(1453,16))

在这里插入图片描述

在这里插入图片描述

案例二:绘制分形树

在这里插入图片描述

在这里插入图片描述

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)
		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) # 画树干长度75的二叉树
t.hideturtle()
turtle.done() # 结束绘制

案例三:谢尔宾斯三角形:

在这里插入图片描述

import turtle


def sierpinski(degree, points):  # 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']})


def drawTriangle(points, color):  # 绘制等边三角形
    t.fillcolor(color)
    t.penup()
    t.goto(points['top'])
    t.pendown()
    t.begin_fill()
    t.goto(points['left'])
    t.goto(points['right'])
    t.goto(points['top'])
    t.end_fill()


def getMid(p1, p2):  # 取两个点的中点,x,y坐标
    return ((p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2)


t = turtle.Turtle()  # 轮廓的三个顶点
points = {'left': (-200, -100),
          'top': (0, 200),
          'right': (200, -100)}

sierpinski(5, points)  # 画三角形

turtle.done()



案例四. 探索迷宫:

important!
在这里插入图片描述

在这里插入图片描述

迷宫的数据结构:Maze Class

class Maze:
	def __init__(self,mazeFileName):
		rowsInMaze = 0
		columnsInMaze = 0
		self.mazelist = []
		mazeFile = open(mazeFileName,'r') #从文本文件读入
		rowsInMaze = 0
		for line in mazeFile:
			rowList = []
			col = 0
			for ch in line[:-1]:
				rowList.append(ch)
				if ch =='S':
					welf.startRow = rowsInMaze
					self.startCol = col 
				col = col + 1
			rowsInMaze = rowsInMaze + 1
			self.mazelist.append(rowlist)
			columnsInMaze = len(rowList)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

递归代码:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值