换零钱方式的统计换零钱方式的统计
问题:给 半美元、四分之一美元、10美分、5美分、1美分的硬币,将任意数量的现金换成零钱,共有多少总不同方式,
算法 1
递归过程
思路:
设,总数为a,硬币总数为n,那么总数目等于
将a换成除第一种硬币外,所有其他硬币的不同方式的数目,加上
将a-d换成不同硬币的总数目,其中d为第一种硬币的币值
注意:
如果a=0,应作为有1种换零钱方式
如果a<0,应作为有0种换零钱方式
如果n=0,应作为有0种换零钱方式
(define (count-change amount)
(cc am...
换零钱方式的统计
问题:给 半美元、四分之一美元、10美分、5美分、1美分的硬币,将任意数量的现金换成零钱,共有多少总不同方式,
算法 1
递归过程
思路:
设,总数为a,硬币总数为n,那么总数目等于
将a换成除第一种硬币外,所有其他硬币的不同方式的数目,加上
将a-d换成不同硬币的总数目,其中d为第一种硬币的币值
注意:
如果a=0,应作为有1种换零钱方式
如果a<0,应作为有0种换零钱方式
如果n=0,应作为有0种换零钱方式
(define (count-change amount)
(cc amount 5))
(define (cc amount kinds-of-coins)
(cond ((= amount 0) 1)
((or (< amount 0) (= kinds-of-coins 0)) 0)
(else (+ (cc amount
(- kinds-of-coins 1))
(cc (- amount
(first-denomination kinds-of-coins))
kinds-of-coins)))))
(define (first-denomination kinds-of-coins)
(cond ((= kinds-of-coins 1) 1)
((= kinds-of-coins 2) 5)
((= kinds-of-coins 3) 10)
((= kinds-of-coins 4) 25)
((= kinds-of-coins 5) 50)))
算法 2
算法分析:
1. 该算法产生出一个属性的递归计算过程,可以看到对这一问题要
出迭代算法就没那
么明显了。
2. 分析算法的写法,可以看出在初始化硬币总类和币值是不那么自然,对比种的把握是通
过一个数值形式的kinds-of-coins来区分,比较生硬,要变出程序来也就要了解
示法,
相比较而言如果是面向对象语言,那么可以很自然用类来定义。
迭代过程:初步分析,所需空间并非常量,应为一个栈空间,且大小不超过a*n.
利用表来提供可用于兑换的硬币,算法:
(define us-coins (list 50 25 10 5 1))
(define uk-coins (list 100 50 20 10 5 2 1 0.5))
(define (cc amount coin-values)
(cond ((= amount 0) 1)
((or (< amount 0) (no-more? coin-values)) 0)
(else
(+ (cc amount
(except-first-denomination coin-values))
(cc (- amount
(first-denomination coin-values))
coin-values)))))
(define (no-more? items)
(null? items))
(define (except-first-denomination items)
(cdr items))
(define (first-denomination items)
(car items))
(cc 100 us-coins)
(cc 100 uk-coins)
292
104561
本文档为【换零钱方式的统计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。