微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用布尔值在 Haskell 中列出组合

如何解决使用布尔值在 Haskell 中列出组合

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

这是我的代码

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

其中,函数状态是:

states _ = [True,False]

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

解决方法

由于您希望您的函数对任意数量的翻转 n 起作用,它可能应该接受一个 Int 参数:否则您将如何获得 Int?而且,正如评论中所建议的,递归是在 Haskell 中执行类似循环的方法,因此您将需要一个基本情况和一个递归情况。对于计数,0 是一个自然的基本情况,并且是这里使用的最佳情况,但是使用 1 作为基本情况对于初学者来说更容易理解,因此我们让 {{1} 的函数中断} 暂时。

因此,您需要一个具有两种模式的函数:

n=0

1 的结果应该是什么,即一次翻转?一旦你有了它,你能在 outcomes :: Int -> [[Bool]] outcomes 1 = _ outcomes n = _ 方面实现 outcomes n 吗?如果是这样,你就完了。如果没有,您将有更好的材料来解决新问题,因为您已经完成了解决方案。

额外的功劳,一旦完成,看看您是否能够很好地理解递归,以便为 outcomes (n - 1) 选择一个可以替代 outcomes 0 作为基本情况的合适值。

,

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

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

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

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

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

>
outcomes ls n = [ … | x < ls,xs <- … ]

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

综合起来,我们将 outcomes 实现为:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。