braid
функция объединяет два элемента списка на элемент.Затем мы применяем braid
к списку, упорядоченному по возрастанию и убыванию.Наконец, поскольку мы в итоге дублируем оригинальный список, мы берем только длину исходного списка.
braid :: [Int] -> [Int] -> [Int]
braid [] as = as
braid ds [] = ds
braid (d:ds) (a:as) = d:a:braid ds as
wave :: [Int] -> [Int]
wave xs = take (length xs) braided
where asc = sort xs
desc = reverse asc
braided = braid desc asc
Сравнительный тест:
, несмотря на тот факт, что я думаю, что моя реализацияДля начинающих на Haskell легче понять, что после того, как я проверил свое решение по отношению к решению ƛƛƛ, мое решение примерно в 4-7 раз медленнее, чем его / ее.
Для списка из ста тысяч:
Для списка длиной в миллион:
Редактировать два: Не использовать reverse
Замена desc = reverse asc
на desc = sortOn Down xs
создает ту же программу скорости, что и для аппликативного решения and иреализация списка понимания волеизъявления.