《python数据结构与算法分析(第2版)》第四章递归相关代码

螺旋线

在这里插入图片描述

from turtle import *

myTurtle = Turtle()
myWin = myTurtle.getscreen()

def drawSpiral(myTurtle, lineLen):
    if lineLen > 0:
        myTurtle.forward(lineLen)
        myTurtle.right(90)
        drawSpiral(myTurtle,lineLen - 5)

drawSpiral(myTurtle,300)
myWin.exitonclick()

分形树

在这里插入图片描述

def tree(branchLen ,t):
    if branchLen >5:
        t.forward(branchLen)
        t.right(20)
        tree(branchLen-15, t)
        t.left(40)
        tree(branchLen - 10, t)
        t.right(20)
        t.backward(branchLen)
t = Turtle()
myWin = t.getscreen()
t.left(90)
t.up()
t.backward(300)
t.down()
t.color("green")
tree(110,t)
myWin.exitonclick()

汉洛塔

def moveTower(height, fromPole, toPole, withPole):
    if height >= 1:
        moveTower(height - 1, fromPole, withPole, toPole)
        print("将" + fromPole + "移动到" + toPole)
        moveTower(height - 1, withPole, toPole, fromPole)

moveTower(3,"1","2","3")

在这里插入图片描述

探索迷宫

在这里插入图片描述

import turtle
from turtle import *
PART_OF_PATH = 'O'
TRIED = '.'#走过的
OBSTACLE = '+'#障碍物
DEAD_END = '-'#死胡同

def searchFrom(maze, startRow, startColumn):
    maze.updatePosition(startRow, startColumn)
    #遇到基本情况
    #1、遇到墙

    if  maze[startRow][startColumn] == OBSTACLE:
        return False
    #遇到已经走过的格子
    if maze[startRow][startColumn] == TRIED:
        return False
    maze.mazelist[startRow][startColumn] = TRIED
    #找到出路
    if maze.isExit(startRow,startColumn):
        maze.updatePosition(startRow, startColumn, PART_OF_PATH)
        return True

    #否则
    found = searchFrom(maze, startRow - 1, startColumn) or \
            searchFrom(maze, startRow + 1, startColumn) or \
            searchFrom(maze, startRow, startColumn + 1) or \
            searchFrom(maze, startRow , startColumn -1)
    if found:
        maze.updatePosition(startRow,startColumn, PART_OF_PATH)
    else:
        maze.updatePosition(startRow,startColumn,DEAD_END)#死胡同
    return found

class Maze:
    def __init__(self, mazeFileName):
        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":#确定起始位置 乌龟的初始位置
                    self.startRow = rowsInMaze#行坐标
                    self.startCol = col#列坐标
                col =col +1
            rowsInMaze = rowsInMaze + 1
            self.mazelist.append(rowList)#迷宫
            columnsInMaze = len(rowList)

        self.rowsInMaze = rowsInMaze#行数
        self.columnsInMaze = columnsInMaze#列数
        self.xTranslate = -columnsInMaze / 2
        self.yTranslate = rowsInMaze / 2
        self.t = Turtle(shape='turtle')
        setup(width=600, height=600)
        setworldcoordinates(-(columnsInMaze - 1) / 2 - .5,
                                -(rowsInMaze - 1) / 2 - .5,
                                (columnsInMaze - 1) / 2 + .5,
                                (rowsInMaze - 1) / 2 + .5)

    def drawMaze(self):
        for y in range(self.rowsInMaze):
            for x in range(self.columnsInMaze):
                if self.mazelist[y][x] == OBSTACLE:#障碍物
                    self.drawCenteredBox(x + self.xTranslate,
                                         -y + self.yTranslate,
                                         'tan')
        self.t.color('black', 'blue')

    def drawCenteredBox(self, x, y, color):
        tracer(0)
        self.t.up()
        self.t.goto(x - .5, y - .5)
        self.t.color('black', color)
        self.t.setheading(90)
        self.t.down()
        self.t.begin_fill()
        for i in range(4):
            self.t.forward(1)
            self.t.right(90)
        self.t.end_fill()
        update()
        tracer(1)

    def moveTurtle(self, x, y):
        self.t.up()
        self.t.setheading(self.t.towards(x + self.xTranslate,
                                         -y + self.yTranslate))
        self.t.goto(x + self.xTranslate, -y + self.yTranslate)

    def dropBreadcrumb(self, color):
        self.t.dot(color)

    def updatePosition(self, row, col, val=None):
        if val:
            self.mazelist[row][col] = val
        self.moveTurtle(col, row)
        if val == PART_OF_PATH:
            color = 'green'
        elif val == OBSTACLE:#障碍物
            color = 'red'
        elif val == TRIED:
            color = 'black'
        elif val == DEAD_END:
            color = 'red'
        else:
            color = None
        if color:
            self.dropBreadcrumb(color)

    def isExit(self, row, col):
        return (row == 0 or
                row == self.rowsInMaze - 1 or
                col == 0 or
                col == self.columnsInMaze - 1)

    def __getitem__(self, idx):
        return self.mazelist[idx]
x = Maze("123")
x.drawMaze()
# x.updatePosition(5,3)
searchFrom(x,5,1)
++++++++++++++++++++++
+   +   ++ ++     +  +
+ +   +       +++ + ++
+ + +  ++  ++++   + ++
+++ ++++++    +++ +  +
+          ++  ++    +
+++++ ++++++   +++++ +
+     +   +++++++  + +
+ +++++++      S +   +
+                + +++
++++++++++++++++++ +++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值