【问题标题】:Recursive Haskell function but only does part of it once递归 Haskell 函数,但只执行一次
【发布时间】: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;你需要弄清楚ab 应该是什么。

标签: function haskell recursion


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2011-02-14
    • 2019-02-28
    • 2013-05-22
    相关资源
    最近更新 更多