Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_okonchatelny_variant.doc
Скачиваний:
0
Добавлен:
05.01.2020
Размер:
553.98 Кб
Скачать

10. Локальное определение.

Часто бывает полезно вычисляя значения выражении давать им имена с тем, чтобы значения эти можно было повторно использовать.

Sump(x) = если равно (х,нил) то двучлен (0,1) иначе двучлен (сар(сумпроизв(сдр(х)))+сар(х), сар(сдр()сумпроизв(сдр(х)))*сар(х))

Неэффективность: в 2 раза увеличивается количество вычислений сумпроизв(сдр(х))

Для решения проблем неэф сущ лучшее средство чем введение доп функции

Введение локальных определений в Лисп: пусть и где

Сумпроизв(х)= если равно (х,нил) то двучлен(0,1) иначе {пусть z = сумпроизв(сдр(х)) двучлен(сар(з)+сар(х), сар(сдр(з))*сар(х))}

Область действия заключается в фигурные скобки.

Сумпроизв(х)= если равно (х,нил) то двучлен(0,1) иначе {пусть н = сар(х) и z = сумпроизв(сдр(х)) {пусть s=car(z) p = cdr(car(z)) двучлен(n+s, n*p)}}

Haskell let where

Let y = a*b

F x=(x+y)/y

In f c + f d

F x y | y>z=

| y<z=

Where z = x*x

11. Функции высших порядков.

Функции высших порядков – функция принимающая другие функции в качестве аргументов.

Умн(у,з)=у*з

Редукция(х,умн,1)

Накопить(н,з) = двучлен(н+сар(з), н*сар(сдр(з)))

Сумпроизв(х)=редукция(х, накопить, двучлен(0,1))

12. Фвп применительно к языку Haskell.

на вход подается текстовая матрица, необходимо удалить из нее все имеющиеся пробелы, вывести результат -- Удалить из предложения любой символ delchar :: [Char] -> Char -> [Char] delchar [] _ = [] delchar (x:xs) k = if (x == k) then delchar xs k else x : delchar xs k -- применяем какую-либо функцию к строке текстовой матрицы map2d :: ([Char] -> Char -> [Char]) -> [­[Char]] -> Char -> [­[Char]] map2d f [­[]] _ = [­[]] map2d f [] _ = [] map2d f (x:xs) k = f x k: map2d f xs k -- удаление любого символа из текстовой матрицы delsim :: [­[­[Char]]] -> Char -> [­[­[Char]]] delsim [­[­[]]] _ = [­[­[]]] delsim [­[]] _ = [­[]] delsim [] _ = [] delsim (x:xs) k = map2d delchar x k : delsim xs k -- удаление пробелов из текстовой матрицы delspace :: [­[­[Char]]] -> [­[­[Char]]] delspace [­[­[]]] = [­[­[]]] delspace [­[]] = [­[]] delspace [] = [] delspace (x:xs) = map2d delchar x (' ') : delspace xs

fact::Integer->Integer

fact 0 = 1 -- если получаемое значения = 0,то факториал = 1.

fact n | n>0 = n * fact (n-1) -- | - знак предшевствующий охраняющему выражению.

lenght::[Integer]->Integer

lenght [] = 0

lenght (x:xs) = 1 + lenght xs

selection :: (Integer->Integer)-> [Integer]->Integer->Integer

selection _ [] _=0 -- если получаемый массив пуст возвращаем 0.

selection f x n= if (n<z) then select f (4*(z-n)) 1 x + selection f x (n+1)

else select f (4*(z-n)) 1 x

where z=(quot (lenght x) 4)

-- проверяем существование выбираемого элемента, если не последний требуемый элемент то запускаем функцию выбора и прибавляем к ее результату результат рекурсивного вызова функции выборки

-- если же элемент последний из требуемых то вызываем функцию выборки

select ::(Integer->Integer)-> Integer->Integer->[Integer]->Integer

select _ _ _ [] =0 -- если получаемый массив пуст возвращаем 0.

select f n k x = if (n==k) then f (head x) else select f n (k+1) (tail x)

-- если № текущего элемента = требуемому № запускаем функцию f от головы списка X,

--иначе рекурсивно вызываем функцию выбора с параметрами: функция для вычисления , № требуемого элемента, увеличенный на единицу № текущей позиции и хвост массива Х

main :: ( (Integer->Integer)->[Integer]->Integer->Integer)->[[Integer]]->Integer

main _ [] = 0 -- если получаемый массив пуст возвращаем 0

main func (x:xs) = func fact x 0 + main func xs -- вызываем получаемую функцию func с параметрами вида: функция вычисляющая факториал и голова массива

--и прибавляем к рез-ту значение возвращаемое при рекурсивном вызове функции main с параметрами вида: полученная функция func и хвост массива.

start :: [[Integer]]->Integer

start [] = 0

start x = main selection x

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]