递归函数中条件的变化

时间:2014-09-12 12:28:08

标签: haskell recursion

首先,这是一项任务,所以我不想要一个完整的解决方案:)

我将计算Cardgame二十一点中牌组的价值。

规则所有 Aces为1或11.

假设我的手是:(Ace,5),我的手现在是16.下一张牌是6,我的手现在(Ace,5,6)22但是我之前已经计算过的ace现在必须改为一个,所以我的手在12点。

我的Hand数据类型是由

递归定义的
data Hand = Empty | Add Card Empty

所以用

计算一个固定值的牌
valueOfHand (Add c h) = cardValue c + valueOfHand h

更改之前出现的值的模式是什么?

2 个答案:

答案 0 :(得分:1)

我不确定你的班级是否已经覆盖了列表monad,但我认为这是解决这个问题最自然的方法。因此,不应让cardValue返回一个简单的值,而应返回一个非确定性值,列出该卡可能具有的所有可能值,即

cardValue :: Card -> [Int]
cardValue Ace = [1, 11]
cardValue Two = [2]
...

valueOfHand将有两个部分:一个用于计算所有可能的手值的列表,另一个用于选择最佳的合法手牌。

如果这足以让您解决它或者您需要更多提示,请告诉我。

答案 1 :(得分:0)

如果您在评论中指出,Ace每手只能有一个值(因此三个Ace的手牌是3或33),那么定义你的是有意义的valueOfHand :: Hand -> Integer的功能首先是非Ace卡,然后处理Ace

我希望这样的功能可以基于这样的东西:

valueOfHand Empty = 0

valueOfHand h = valueOfAces (filter (\c -> c == Ace) h) (filter (\c -> c /= Ace) h)

对于某些功能valueOfAces :: Hand -> Hand -> Integer