1.分形树
利用python自带的turtle()及递归思想绘制一个分型树
代码如下:
from turtle import *
def tree(brenchLen ,t):
if brenchLen>5:
t.forward(brenchLen)
t.right(20)
tree(brenchLen-15,t)
t.left(40)
tree(brenchLen-10,t)
t.right(20)
t.backward(brenchLen)
t=Turtle()
myWin=t.getscreen()
t.left(90)
t.up()
t.backward(300)
t.down()
t.color('blue')
tree(110,t)
myWin.exitonclick()
效果如下图:
2.找零问题
问题如下:顾客用一张一美元的纸币买了37美分的物品,问至少要找给顾客多少枚硬币?(硬币的种类有1美分,5美分,10美分,25美分)
用递归问题解决这个问题有如下方法
1.直接用递归解决问题,代码如下
# 直接用递归方法实现找零问题
def recMC(coinValueList,change):
minCoins=change
if change in coinValueList:
return 1
else:
for i in [c for c in coinValueList if c<=change]:
numCoins=1+recMC(coinValueList,change-i)
if numCoins<minCoins:
minCoins=numCoins
return minCoins
a=recMC([1,5,10,25],63)
print('%s'%a)
2.添加查询表优化算法
def recMC(coinValueList,change,knownResults):
minCoins=change
if change in coinValueList:
knownResults[change]=1
return 1
elif knownResults[change]>0:
return knownResults[change]
else:
for i in [c for c in coinValueList if c<=change]:
numCoins=1+recMC(coinValueList,change-i,knownResults)
if numCoins<minCoins:
minCoins=numCoins
knownResults[change]=minCoins
return minCoins
a=recMC([1,5,10,25],63,[0]*64)
print('%s'%a)
另外还有不用递归的动态规划解决方案
如下:
def dpMakeChange(coinValueList,change,minCoins,coinsUsed):
for cents in range(change+1):
coinCount=cents
newCoin=1
for 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]
def printCoin(coinsUsed,change):
coin=change
while coin>0:
thiscoin=coinsUsed[coin]
print(thiscoin)
coin=coin-thiscoin
c1=[1,5,10,21,25]
coinUsed=[0]*64
coincount=[0]*64
a=dpMakeChange(c1,63,coincount,coinUsed)
printCoin(coinUsed,63)
printCoin(coinUsed,52)