【发布时间】: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