Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
10
Добавлен:
28.06.2014
Размер:
1.08 Кб
Скачать
--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)

Соседние файлы в папке 2