我正在深入研究Haskell文本并遇到了一个关于进行更改的问题。我给了一个(denomonation,numCoins)元组的有序列表以及一个数量,需要返回一个列表,列出每个硬币用于进行更改的数量。我有以下代码解决了这个问题:
useCoins :: (Int,Int) -> Int -> Int
useCoins (denomination, numCoins) target = min numCoins (target `div` denomination)
makeChange :: [(Int, Int)] -> Int -> [Int]
makeChange [] target = []
makeChange ((denomination, numCoins):xs) target =
let
coinsUsed = useCoins (denomination, numCoins) target
in coinsUsed : makeChange xs (target - (coinsUsed * denomination))
问题在于这是关于高阶函数的一章,我很难想出一种使用map的方法,因为当目标值从列表中删除时它会发生变化。我很乐意帮忙。
感谢。
-mh
答案 0 :(得分:5)
map
是一个错误的函数,因为你注意到它只适用于每个元素可以独立处理的情况,而不是当元素相互依赖时。
但是,makeChange
是一个可通过折叠实现的功能。具体来说,您的实现包含了左折叠的所有功能,但是手工完成;您可以使用foldl'
。