递归Haskell函数,但仅执行一次

时间:2020-11-05 17:24:23

标签: function haskell recursion

我有一个功能,需要计算出分解一定金额所需的最小零钱。

用户将输入货币值和可能的面额,并且将输出每个面额需要多少来构成货币,例如。

> 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,此刻它将重置列出,因为它将被称为每次递归。

所以我的问题是,在进行递归之前,有没有办法让一个函数只能调用一次另一个函数。

希望我已经说清楚了,谢谢

1 个答案:

答案 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)