【发布时间】:2021-02-18 10:57:22
【问题描述】:
我有一个函数需要计算出分解一定金额所需的最小变化。
用户将输入货币的价值和可能的面额,然后它会输出每个面额需要多少个面额来弥补金钱。
> coinChange 34 [1, 5, 10, 25, 50, 100]
[4,1,0,1,0,0]
这是我目前所拥有的:
coinChange :: Integer -> [Integer] -> [Integer]
coinChange _ [] = []
coinChange 0 xs = []
coinChange v xs = do
dropWhile (>v) (reverse xs)
createNewList :: Integer -> [Integer]
createNewList 0 = []
createNewList x = 0 : createNewList (x - 1)
我有一个名为 createNewList 的单独函数,我想调用它来在开头设置一个新的 0 列表。
但是,因为我打算在计算还剩多少钱时将coinChange 设为递归函数,如果我只是在coinChange 中调用makeNewList,此时它会重置列表,因为它会被调用每次递归。
所以我的问题是,有没有办法让一个函数在继续递归之前只调用另一个函数一次。
希望我已经说清楚了,谢谢
【问题讨论】:
-
只需创建一个递归辅助函数,然后从您的实际函数中调用该辅助函数。
-
表达式
createNewList n似乎等同于更简单的replicate n 0。 -
我认为不需要创建 0 列表。您将把
tail xs传递给递归调用,并在其返回值前添加一些内容。例如,coinChange v (x:xs)= a : coinChange (v - b) xs;你需要弄清楚a和b应该是什么。
标签: function haskell recursion