【问题标题】:List combinations in Haskell with booleans在 Haskell 中使用布尔值列出组合
【发布时间】:2021-02-19 18:11:50
【问题描述】:

所以,我最近开始学习 Haskell,遇到了一个问题,如果翻转 n 个硬币,我需要计算所有可能的结果(2^n)。例如,如果翻转了 2 个硬币,则输出应为 [[H, H], [H, T], [T, H], [T, T]]。同样,对于 3 个硬币,它应该是 [[H, H, H], [H, H, T], [H, T, H], [T, H, H], [H, T, T], [ T,T,H],[T,H,T],[T,T,T]]。我的函数不适用于 n 的任意值。仅当我从以前知道 n 时才有效。我正在考虑使用递归,但我不确定语法。

这是我的代码:

outcomes(x:xs) = [[a, b] | a <- states x, b <- states (head xs)]

其中,函数状态为:

states _ = [True, False]

此函数适用于 n = 2。请告诉我如何使其适用于任何输入 n。

【问题讨论】:

  • 你对任意数量的项目做了什么尝试?
  • 所以,如果我写结果 [H, H, H, H] 它应该输出所有可能的状态,即 16。如果我写 [H, H, T, H ]。因此,该函数关注的不是列表中的值,而是列表中的项目数。因此,如果我将函数更改为 results(x:xs:xss) = [[a, b, c] | a
  • 提示:利用递归。
  • 但这没关系,您可以使用 int。请注意,如果您要返回一个列表,则不需要在函数的头部写(x:xs)。函数头部的项目处理输入,而不是输出。
  • 除了家庭作业和练习,你正在计算一个笛卡尔积,它通过[] monad 和replicateM 处理。例如,replicateM 2 ["H", "T"] == [["H","H"],["H","T"],["T","H"],["T","T"]]

标签: list haskell recursion combinations probability


【解决方案1】:

你可以在这里使用递归。我们可以构造一个函数,它接受元素列表[a]Int,所以:

outcomes :: [a] -> Int -> [[a]]

如果整数小于或等于零,那么只有一个可能的结果是一个空列表。所以我们返回一个包含一个空列表的列表:

outcomes _ n | n <= 0 = [[]]

对于递归的情况,我们可以从列表中获取一个元素,然后使用相同的值列表进行递归,但我们会创建少一个元素的结果,然后将我们获取的元素添加到这些结果中。

outcomes ls n = [ … | x &lt; ls, xs &lt;- … ]

我把 部分留作练习。在第一个 片段中,您需要在xs 前面加上x。在第二个中,您需要进行递归调用。

所以把这些放在一起,我们将outcomes 实现为:

outcomes :: [a] -> Int -> [[a]]
outcomes _ n | n <= 0 = [[]]
outcomes ls n = [ … | x < ls, xs <- … ]

【讨论】:

    【解决方案2】:

    既然您希望您的函数在任意次数的翻转n 上工作,它可能应该接受一个 Int 参数:否则您将如何获得一个 Int?而且,正如 cmets 中所建议的那样,递归是在 Haskell 中执行类似循环的事情的方式,因此您将需要一个基本案例和一个递归案例。对于计数,0 是一个自然的基本情况,也是在这里使用的最好的情况,但是使用 1 作为基本情况对于初学者来说更容易理解,所以我们将让函数 break for n=0 for现在。

    所以,你需要一个有两种模式的函数:

    outcomes :: Int -> [[Bool]]
    outcomes 1 = _
    outcomes n = _
    

    1 的结果应该是什么,即一次翻转?一旦你有了它,你能用outcomes (n - 1) 来实现outcomes n 吗?如果是这样,你就完了。如果没有,您将获得更好的材料来解决新问题,因为您已经完成了解决方案。

    为了获得额外的荣誉,一旦完成,看看您是否能够充分理解递归,从而为outcomes 0 选择一个可以替换outcomes 1 作为基本情况的好值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-06
      • 2015-06-25
      • 1970-01-01
      • 2015-07-11
      • 2020-05-01
      • 2018-10-19
      • 2015-05-23
      • 2011-11-28
      相关资源
      最近更新 更多