вот мой код: (должен нормально работать)
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 #,и это домашнее задание, основанное на критериях моего профессора,
(задание выполнено, этот вопрос для любопытства)