这是我的代码:(应该可以正常工作)
let rec interleave = function
| ([],ys) -> []
| (xs,[]) -> []
| (x::xs,y::ys) -> x :: y :: interleave (xs, ys)
let gencut n list =
let first = list |> Seq.take n |> Seq.toList
let last = list |> Seq.skip n |> Seq.toList
(first, last)
let cut list = gencut ((List.length list)/2) list
let shuffle x = interleave (cut x)
let isNotSame (list1, list2) = if list1 = list2 then false else true
let countShuffles xs =
let mutable newList = xs
let mutable x = 1
if (List.length(xs) > 1) then newList <- shuffle newList
while isNotSame (newList, xs) do
newList <- shuffle newList
x <- x + 1
x
//lists countShuffles from 1 to x
let listShuffles x =
for i = 1 to x/2 do
let y = [1..(i*2)]
let z = countShuffles y
printf "A deck of %d cards takes %d shuffles\n" (i*2) z
printf ""
流程是(从主要功能到第一个帮助者): listShuffles - &gt; countShuffles - &gt; shuffle + isNotSame - &gt;切 - &gt; gencut + interleave (所以试试listShuffles)
“countShuffles”的作用是: 取一个int,创建一个列表,(1..n),(它应该代表一副牌), 削减一半,做一个完美的洗牌(完美的桥洗牌) 并计算重新制作甲板原件需要多少次洗牌
listShuffles的作用是: 取一个int,并打印出countShuffles 1到n
(你需要在牌组中使用均匀数量的牌)
对此解释感到抱歉,现在我的问题是:
是否可以查看返回某个号码的次数? 即: listShuffles 10000 ;; 看看“16”出现了多少次。
我正在考虑制作一份清单。并递增给定的索引。
表示返回的某个数字。
但我无法找到如何做到这一点......
P.S。我不在乎我的代码是错误的或类似的东西,
这是我的第一个F#课程,它是根据我教授的标准做作业,
(作业完成,这个问题是好奇心)
答案 0 :(得分:2)
有一些替代方案
如果您只想要一个号码
List |> Seq.sumBy (fun t -> if t = 16 then 1 else 0)
如果你想要一系列不同的数字,那么最好做
let map = List |> Seq.countBy (fun t -> t) |> Map.ofSeq
然后map.[16]
是16
在列表中出现的次数
答案 1 :(得分:1)
您可以执行以下操作:
let listShuffles x =
[| for i = 1 to x/2 do
yield countShuffles [1..(i*2)] |]
现在这个函数返回数组,然后你可以使用数组模块函数来查找数字出现的次数
listShuffles 1000 |> Array.filter ((=) 16) |> Array.length
或者打印所有这些数字及其出现次数:
listShuffles 100
|> Array.toSeq |> Seq.groupBy id
|> Seq.iter (fun (k,v) -> printfn "%d appears %d times" k (v.Count()))