如何递增列表的某个索引?

时间:2011-09-13 10:29:51

标签: list f# iteration

这是我的代码:(应该可以正常工作)

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#课程,它是根据我教授的标准做作业,

(作业完成,这个问题是好奇心)

2 个答案:

答案 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()))