defmoveTower(height,fromPole, toPole, withPole):if height >=1:
moveTower(height-1,fromPole,withPole,toPole)
moveDisk(fromPole,toPole)
moveTower(height-1,withPole,toPole,fromPole)defmoveDisk(fp,tp):print("moving disk from",fp,"to",tp)
moveTower(2,"A","B","C")
moving disk from A to C
moving disk from A to B
moving disk from C to B
5、探索迷宫
import turtle
PART_OF_PATH ='O'
TRIED ='.'
OBSTACLE ='+'
DEAD_END ='-'classMaze:def__init__(self,mazeFileName):
rowsInMaze =0
columnsInMaze =0
self.mazelist =[]
mazeFile =open(mazeFileName,'r')
rowsInMaze =0for line in mazeFile:
rowList =[]
col =0for 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.Turtle()
self.t.shape('turtle')
self.wn = turtle.Screen()
self.wn.setworldcoordinates(-(columnsInMaze-1)/2-.5,-(rowsInMaze-1)/2-.5,(columnsInMaze-1)/2+.5,(rowsInMaze-1)/2+.5)defdrawMaze(self):
self.t.speed(10)
self.wn.tracer(0)for y inrange(self.rowsInMaze):for x inrange(self.columnsInMaze):if self.mazelist[y][x]== OBSTACLE:
self.drawCenteredBox(x+self.xTranslate,-y+self.yTranslate,'orange')
self.t.color('black')
self.t.fillcolor('blue')
self.wn.update()
self.wn.tracer(1)defdrawCenteredBox(self,x,y,color):
self.t.up()
self.t.goto(x-.5,y-.5)
self.t.color(color)
self.t.fillcolor(color)
self.t.setheading(90)
self.t.down()
self.t.begin_fill()for i inrange(4):
self.t.forward(1)
self.t.right(90)
self.t.end_fill()defmoveTurtle(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)defdropBreadcrumb(self,color):
self.t.dot(10,color)defupdatePosition(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 =Noneif color:
self.dropBreadcrumb(color)defisExit(self,row,col):return(row ==0or
row == self.rowsInMaze-1or
col ==0or
col == self.columnsInMaze-1)def__getitem__(self,idx):return self.mazelist[idx]defsearchFrom(maze, startRow, startColumn):# try each of four directions from this point until we find a way out.# base Case return values:# 1. We have run into an obstacle, return false
maze.updatePosition(startRow, startColumn)if maze[startRow][startColumn]== OBSTACLE :returnFalse# 2. We have found a square that has already been exploredif maze[startRow][startColumn]== TRIED or maze[startRow][startColumn]== DEAD_END:returnFalse# 3. We have found an outside edge not occupied by an obstacleif maze.isExit(startRow,startColumn):
maze.updatePosition(startRow, startColumn, PART_OF_PATH)returnTrue
maze.updatePosition(startRow, startColumn, TRIED)# Otherwise, use logical short circuiting to try each direction# in turn (if needed)
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
myMaze = Maze('maze2.txt')
myMaze.drawMaze()
myMaze.updatePosition(myMaze.startRow,myMaze.startCol)
searchFrom(myMaze, myMaze.startRow, myMaze.startCol)
True
6、动态规划
硬币找零
defrecMC(coinValueList,change):
minCoins = change # 全部使用1美分兑换为硬币最多的情形if change in coinValueList:return1else:for i in[c for c in coinValueList if c <= change]:
numCoins =1+ recMC(coinValueList,change-i)if numCoins < minCoins:
minCoins = numCoins
return minCoins
print(recMC([1,5,10,25],63))
6
上述算法非常低效,原因在于有太多的重复计算
#性能更好defrecDC(coinValueList,change,knownResults):
minCoins = change
if change in coinValueList:
knownResults[change]=1return1elif knownResults[change]>0:return knownResults[change]else:for i in[c for c in coinValueList if c <= change]:
numCoins =1+ recDC(coinValueList, change-i,
knownResults)if numCoins < minCoins:
minCoins = numCoins
knownResults[change]= minCoins
return minCoins
print(recDC([1,5,10,25],63,[0]*64))
6
上面的算法并不是真正的动态规划算法,下面使用真正的动态规划
defdpMakeChange(coinValueList,change,minCoins,coinsUsed):for cents inrange(change+1):
coinCount = cents
newCoin =1for j in[c for c in coinValueList if c <= cents]:if minCoins[cents-j]+1< coinCount:
coinCount = minCoins[cents-j]+1
newCoin = j
minCoins[cents]= coinCount
coinsUsed[cents]= newCoin
return minCoins[change]defprintCoins(coinsUsed,change):
coin = change
while coin >0:
thisCoin = coinsUsed[coin]print(thisCoin)
coin = coin - thisCoin
defmain():
amnt =63
clist =[1,5,10,21,25]
coinsUsed =[0]*(amnt+1)
coinCount =[0]*(amnt+1)print("Making change for",amnt,"requires:")print(dpMakeChange(clist,amnt,coinCount,coinsUsed),"coins")print("They are:")
printCoins(coinsUsed,amnt)print("The used list is as follows:")print(coinsUsed)
main()