Как увеличить определенный индекс списка? - PullRequest
1 голос
/ 13 сентября 2011

вот мой код: (должен нормально работать)

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 ""

Поток (от основной функции до 1-го помощника): listShuffles -> countShuffles -> shuffle + isNotSame -> cut -> gencut +interleave (поэтому просто попробуйте listShuffles)

То, что делает countShuffles: принимает int, создает список, (1..n) (который должен представлять колоду карт), обрезает егонаполовину, делает совершенный shuffle (совершенный бридж-шаффл) и подсчитывает, сколько тасов требуется, чтобы снова сделать колоду оригинальной

Что делает listShuffles: принимает int и печатает countShuffles с 1 по n

(вам нужно четное количество карт в колоде)

Извините за объяснение, теперь мой вопрос:

можно ли увидеть, сколько раз возвращается определенное число?то есть: listShuffles 10000 ;;посмотрите, сколько раз появилось «16».

я думал о создании списка.

и увеличении заданного индекса.

, который представляет определенное число, которое было возвращено.

но я не могу найти, как это сделать ...

ps Мне все равно, как мой код неправильный или что-то в этом роде,

это моя первая программа на F #,и это домашнее задание, основанное на критериях моего профессора,

(задание выполнено, этот вопрос для любопытства)

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

Есть несколько альтернатив

Если вам нужен только один номер, вы можете сделать

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 голос
/ 13 сентября 2011

Вы можете сделать что-то вроде:

let listShuffles x =
    [| for i = 1 to x/2 do
        yield countShuffles [1..(i*2)] |]

Теперь эта функция возвращает массив, а затем вы можете использовать функции модуля Array, чтобы найти, сколько раз число появляется

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()))
...