我有一个功能,需要计算出分解一定金额所需的最小零钱。
用户将输入货币值和可能的面额,并且将输出每个面额需要多少来构成货币,例如。
> 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
成为递归函数,因此,如果我只是在makeNewList
中调用coinChange
,此刻它将重置列出,因为它将被称为每次递归。
所以我的问题是,在进行递归之前,有没有办法让一个函数只能调用一次另一个函数。
希望我已经说清楚了,谢谢
答案 0 :(得分:0)
通常,您可以在Haskell中创建本地帮助程序功能。也许这个例子会启发您:
prepareData x = if x < 0 then -x else x
mainFunction n =
let recursiveLocalFunction x =
if x < 2 then 1 else x * recursiveLocalFunction (x - 1)
in recursiveLocalFunction (prepareData n)