Добавил:
Tushkan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Готовые лабораторные работы / 2 / 213
.hs --2.13. Описать функцию f :: [a] -> [[a]], формирующую для заданного списка список всех возможных перестановок элементов исходного списка.
--n^4
f213 xs = f213_1 xs 0
f213_1 [] _ = [[]]
f213_1 xs i = if i < len xs then
f21 (addl (f213_1 (del i xs) 0) (nth i xs)) (f213_1 xs (i+1))
else
[]
-- Удалить элемент - слоность n
del i [] = error "range error"
del 0 (x: xs) = xs
del i (x: xs) = x:(del (i-1) xs)
-- Получить элемент - сложнть n
nth i [] = error "range error";
nth 0 (x:xs) = x
nth i (x:xs) = nth (i-1) xs
-- Вычисление длины списка - сложность n
len [] = 0;
len (x:xs) = 1+ len xs
-- Присоединение элемента слева ко всем эл-там списка
-- Сложность n
addl [] a = []
addl (x:xs) a = (a:x):(addl xs a)
--Описать функцию concat :: [a]->[a]->[a] такую, что concat [x1..xn] [y1..ym] = [x1..xn y1..ym].
--Пока первый список не пуст "копируем" его поэлементно.
--Иначе "копируем" второй в конец
f21 [] [] = []
f21 [] (y: ys) = y:(f21 [] ys)
f21 (x:xs) ys= x:(f21 xs ys)
--n^4
f213 xs = f213_1 xs 0
f213_1 [] _ = [[]]
f213_1 xs i = if i < len xs then
f21 (addl (f213_1 (del i xs) 0) (nth i xs)) (f213_1 xs (i+1))
else
[]
-- Удалить элемент - слоность n
del i [] = error "range error"
del 0 (x: xs) = xs
del i (x: xs) = x:(del (i-1) xs)
-- Получить элемент - сложнть n
nth i [] = error "range error";
nth 0 (x:xs) = x
nth i (x:xs) = nth (i-1) xs
-- Вычисление длины списка - сложность n
len [] = 0;
len (x:xs) = 1+ len xs
-- Присоединение элемента слева ко всем эл-там списка
-- Сложность n
addl [] a = []
addl (x:xs) a = (a:x):(addl xs a)
--Описать функцию concat :: [a]->[a]->[a] такую, что concat [x1..xn] [y1..ym] = [x1..xn y1..ym].
--Пока первый список не пуст "копируем" его поэлементно.
--Иначе "копируем" второй в конец
f21 [] [] = []
f21 [] (y: ys) = y:(f21 [] ys)
f21 (x:xs) ys= x:(f21 xs ys)