递归问题的两个实例(数据结构与算法2)

本文介绍了如何使用Python的turtle模块绘制分形树,通过递归实现艺术性的几何图形。同时,文章探讨了递归方法在解决找零问题上的应用,提供了直接递归和优化后的递归解决方案,以及动态规划的非递归解法,展示了在实际问题中如何高效地计算最少硬币组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值