【发布时间】:2020-03-14 01:01:15
【问题描述】:
我有以下函数“change”,它需要支付一定数量的钱,用于支付的钞票/硬币的大小,并返回一个包含 “硬币”数量的列表 ($50, $20 $10 $5 $2 and $1) 完成交易后会收到:
(define (change total payment)
(let [(x (- payment total))]
(change-aux x '(50 20 10 5 2 1))))
(define (change-aux change coins)
(cond
[(empty? coins) empty]
[else (let [(num-coins (floor (/ change (car coins))))]
(append (list num-coins)
(change-aux (- change (* (car coins) num-coins)) (cdr coins))))]))
所以,如果我输入这些参数:
> (change 44 200)
它返回输出:
'(3 0 0 1 0 1)
即 200-44 = 156,对应于 3 个价值 50 美元的硬币、1 个价值 5 美元的硬币和 1 个价值 1 美元的硬币。
我的问题是,是否有一种更优雅、更简化的方式来编写类似程序而不依赖辅助函数,而是使用 lambda、filter、map、foldr、foldl 等?
提前致谢。
【问题讨论】:
-
欢迎来到 StackOverflow!该站点是针对有关编程的具体、客观的问题。一般批评或审查请求被视为离题,应转至CodeReview.SE。
-
谢谢布赖恩,从现在开始会牢记在心。有没有办法手动将此问题移至 CodeReview? (完整的新手在这里)
-
函数接口与描述不符。功能是取“一定要支付的金额”(单次输入)。代码引入了两个参数,函数立即将它们相减,不再使用。
-
注意这个问题和base转换很相似。例如,用十进制表示 1234 与使用“硬币”(1000 100 10 1) 兑换零钱是同一个问题。