Я просто озадачен этим, это петля типа Haskell, которую я не могу понять, как писать. В принципе, я определил три функции: split, riffle и shuffle.Зацикливание на функции в Haskell
split :: [a] -> ([a],[a])
split xs = splitAt (length xs `div` 2) xs
riffle :: [a] -> [a] -> [a]
riffle xs [] = xs
riffle [] ys = ys
riffle (x:xs) (y:ys) = x:y:riffle xs ys
shuffle :: Int -> [a] -> [a]
shuffle 0 xs = xs
shuffle n xs = shuffle (n-1) (riffle a b)
where (a, b) = split xs
В основном расколоть просто разбивает список пополам, желобок должен «чередование» два списков, так, например:
riffle [1,2,3] [4,5,6] = [1,4,2,5,3,6]
И перетасовки является итерация количества расщепления и Нарезки из список элементов. Теперь мне нужно определить функцию повторений, которая выводит, сколько итераций тасования потребовалось бы, чтобы снова получить исходный список. Функция определяется как таковую:
repeats :: [Int] -> Int
Я просто застрял, как вы можете выполнить цикл по перетасовки ... Я думаю, что это имеет какое-то отношение списка понимания, но я не мог ничего , Мне еще предстоит попробовать выражение лямбды, но я не думаю, что это необходимо. Кстати, перетасовка должна выполняться в списках с четным количеством элементов. Есть идеи?
Вы также можете сгенерировать список с помощью 'tail $ iterate', как описывает @hammar, и использовать [' elemIndex'] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/ Data-List.html # v: elemIndex), чтобы найти индекс повторения. – dflemstr