首页 > 解决方案 > 递归 Haskell 函数,但只执行一次

问题描述

我有一个函数需要计算出分解一定数量的钱所需的最小变化。

用户将输入货币的价值和可能的面额,它会输出每种面额需要多少来弥补货币,例如。

> 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还剩多少钱时创建一个递归函数,所以如果我只调用makeNewListin coinChange,此时它会重置列表,因为每次递归都会调用它。

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

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

标签: functionhaskellrecursion

解决方案


一般来说,您可以在 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) 

推荐阅读