List 预定义列表F的和#
我是一名初学者,目前正在21点F#实现中尝试一些列表操作 我试图将我创建的列表中的元素汇总如下:List 预定义列表F的和#,list,recursion,f#,sum,blackjack,List,Recursion,F#,Sum,Blackjack,我是一名初学者,目前正在21点F#实现中尝试一些列表操作 我试图将我创建的列表中的元素汇总如下: let cardsvalue (k: Cards): List<int> = match k with |Ace -> [1;11] |Two -> [2] |Three -> [3] |Four -> [4] |Five -> [5] |Six -> [6] |Seven ->
let cardsvalue (k: Cards): List<int> =
match k with
|Ace -> [1;11]
|Two -> [2]
|Three -> [3]
|Four -> [4]
|Five -> [5]
|Six -> [6]
|Seven -> [7]
|Eight -> [8]
|Nine -> [9]
|Ten | Jack | Queen | King -> [10]
不接受+反对者
我希望看到这个问题的可能实施。谢谢你抽出时间
我是初学者
您的代码显示了一种很好的系统方法,并且您已经完成了大部分工作,以允许类型系统(和intellisense)帮助解决您的问题
let cardsvalue(k:Cards):列表=
一个具有正确类型签名的有用函数。请注意,它已变灰。这意味着你没有使用它
let rec CardPoints(cp:List):List=
也完全正确。您正在尽可能多地帮助类型系统,这使得它几乎可以肯定,它将发现某些错误的确切位置
我总是以类型不匹配或不支持运算符错误而告终。比如说
let rec CardPoints (cp: List<Cards>): List<int> =
match cp with
| head :: tail -> head + CardPoints tail
| [] -> 0
| head::tail->head+CardPoints tail
尝试使用绑定来帮助解决此问题:
|头::尾->
让tailPoints=CardPoints tail
头+尾点
您可以(通过将鼠标悬停在它们上方)判断头部
是卡片
,尾点
是列表
。因此,您正在尝试将卡
添加到列表
中,但没有定义此类添加操作
因此,您已经将其细化为一个较小的任务:给定一张卡(
头:卡
),并从剩余卡中给定可能的点(尾点:列表
),如何从所有卡中找到可能的点,这应该是一张列表
?您将需要使用当前未使用的函数cardsvalue
和另一小步,然后您就可以使用了。好的,您的答案非常接近。
但是您正在尝试将一张“卡”添加到INT列表中。
你要做的是把每一张卡的可能值加在其他卡的总和上
好吧,我可能不会这么做,但也许这是最容易理解的答案(假设你理解列表理解)
它在功能上也不是很完美,但我会让你去发现和修复它
let rec cardPoints (cp: List<Card>): List<int> =
match cp with
| head :: tail ->
[ for val1 in cardsvalue head do
for val2 in cardPoints tail do
val1 + val2 ]
| [] -> [0]
let rec cardPoints(cp:List):List=
匹配cp
|头:尾->
[对于卡片中的val1值头do
对于cardPoints尾部的val2,请执行以下操作
val1+val2]
| [] -> [0]
您正试图将一个数字添加到数字列表中。您非常接近,因此告诉您会破坏它。您介意分享吗?这里的问题是,这群人从那些想让你做家庭作业的人那里得到帖子……因此,人们对明确给出全部答案感到非常紧张。是的,我看得出来。我想人们会更乐意留下一个没有答案的问题。你能展示一下它是怎么做到的吗?我无法让它发挥作用。最后一个问题-您如何实现Ace得分不超过21分的条件,例如[Ace;Ace;Ace]
应仅为13(1+1+11)和[Ace;5;Ace]
将是17。我个人会定义我自己的类型点=int的Hard of int | int的Soft of int*int
,然后使用类似这样的将cp与| Hard x->Hard x | Soft(x,y)->如果y>21,那么Hard x,else Soft(x,y)
匹配,但这需要我重新编写所有内容。你能告诉我,如果我们使用第三个函数,例如let-CalScore(cp:List):int=
@BillyFitt,它会是什么样子吗?我会得到原始问题并尝试在尝试扩展或替代之前工作。您需要创建一个函数,该函数给定一个Cards
和一个int-list
剩余卡片的可能分数,将返回整个可能分数的int-list
。您已经有了一个功能,可以从卡中获得可能的分数。这可以用来简化问题,消除卡
,因此在剩下的步骤中,您只需使用ints即可。最初的问题是我在帖子中提出的。你能告诉我怎么做吗,我的意思是使用我目前未使用的函数cardsvalue和另一小步-我不知怎么的仍然无法让它正常工作你的cardsvalue函数给你第一张卡的可能值(一个int list
),递归给你尾点,另一个int list
。因此问题归结为:给定两个int list
s,找出所有可能的和。要做到这一点,您可能会发现使用函数List.map
和List.concat
,或者使用“yield”语法来构造一个列表[对于某些序列中的x,do yield f(x)]
。谢谢!你可能想编辑yield
到val1+val2
。我还没有测试过这一点,隐式收益在F#中是受支持的,所以在我看来它是有效的,它会给出重复的。