Модул 11. Функционално програмиране

Материалиarrow-up-right | Задачиarrow-up-right | Решенияarrow-up-right | Видеоarrow-up-right

Съдържание

  1. Въведение

  2. Функции и стойности

  3. Рекурсия

  4. Списъци

  5. Функции от по висок ред

  6. Затваряне на състояние във функция

  7. Подготовка за изпит

1. Въведение

Инсталация

Първа програма

  1. VS Code > File > New [Ctrl + N]

  1. VS Code > File > Save [Ctrl + S]

  1. VS Code > Terminal > New terminal [Ctrl + Shift + `]

2. Функции и стойности

Деклариране на функция

Функция с повече параметри

Използване на скоби

Функции като стойности на функция

Композиция

Рекурсия

3. Рекурсия

В Haskell няма цикли. Циклите се реализират чрез рекурсия. Итерациите се реализират с рекурсивни извиквания. Итераторите се реализират като параметри и се променят при всяко рекурсивно извикване.

Рекурсивна реализация на цикли

За функциите, които зависят от външно състояние се използва помощна функция:

Задача

Дефинирайте функция, която намира сбора на първите 10 естествени числа.

Опашкова рекурсия

Опашковата рекурсия е рекурсия, при която последното извършвано действие е рекурсивно извикване.

  • Оптимизация на опашката = Tail Call Optimizationarrow-up-right

  • Вместо с последващо връщане рекурсивното обръщение се реализира със преход без връщане

  • При тази рекурсия заделената в стека памет се преизползва вместо да се заделя нова

  • Намалява разхода на памет и обикновено подобрява бързината на алгоритъма, но по-трудно се откриват грешки

4. Списъци

Инициализация на списък

Празен списък

Операторът :

Символните низове също са списъци

Глава и опашка на списъци

Глава на списъка е първият елемент от него

Опашка на списъка е всичко останало освен главата

В комбинация от функциите можем да достъпим следващия елемент от списъка

Рекурсивно обхождане на списък

Рекурсивно обхождане на списък и умножаване на всяка стойност по 2:

Функция, филтрираща елементите в списък (премахва нечетни числа):

Дължина на списък

За намиране на дължината на списък се използва функцията length

Собствена функция за намиране на дължината

Създаване на списък чрез рекурсия

Създаване на списък чрез рекурсия:

Създаване на обърнат списък чрез рекурсия:

В Haskell създаването на списък може да продължава до безкрайност:

Задача

Дефинирайте функция, която приема списък и число n и връща като резултат n-тия елемент от списъка

5. Функции от по-висок ред

Абстракции чрез функции

  • Ако функция a приема като параметри b, c и друга функция func и връща резултат извиканата функция func с параметри b и c, то резултатът всеки път ще е различен

  • Резултатът зависи от подадената функция func, като единственото условие е тя да приема същия брой параметри, които и се подават в тялото на a

Изчисления върху списъци

Функцията map приема като параметри функция и списък и връща като резултат нов списък, като върху един елемент от първоначалният списък е извикана подадената функция.

Функцията filter тества всеки елемент от списък и връща само тези, които минават теста (функция, която връща тип boolean)

Сгъване на списък е комбиниране на всички стойности от списъка в една. Има две вградени функции, които правят това:

  • Функцията foldl = действията се извършват от ляво надясно

  • Функцията foldr = действията се извършват от дясно наляво

И двете функции приемат три параметъра:

  • Акумулатор - функцията, която ще се извиква между елементите на списъка

  • Начална стойност, от която да започне изчислението

  • Самият списък

И при двете функции изчисленията започват от стойността на акумулатора:

  • foldl е по-бърза функция

  • foldr намира приложението си при работа с безкрайни списъци

Функцията zip приема като аргументи два списъка и връща като резултат списък от двойки, където първият елемент е от първият списък, а другият от вторият списък.

Функцията zipWith освен два списъка приема и функция, която да използва при комбинирането на елементи от двата списъка.

Задача

Дефинирайте функция, която приема лист и връща най-големият елемент от нея. Използвайте някоя от научените функции за изчисления върху списък.

Анонимни функции

Следният синтаксис често обърква и прави кода нечетим

В такива случаи много удобни за използване са анонимните функции

В Haskell е възможно и да се дават имена на анонимни функции, ако по някаква причина това е нужно

Анонимните функции имат огромно приложение при използването на вградените в Haskell функции map и foldl/foldr при работа със списъци

Задача

Използвайте вградената в Haskell функция zipWith, като за първи параметър (функция) използвате ваша анонимна функция, която връща сбора на два елемента.

6. Затваряне на състояние във функция

  • В Haskell съществуват функции с така наречените "свободни променливи" (променливи, които не са директно подадени като параметър на функцията)

  • Функциите със свободни променливи наричаме функции с вътрешно състояние

  • Haskell използва функции със свободни променливи почти навсякъде т.е. функциите с вътрешно състояние се използват навсякъде

Пример

f връща функция с вътрешно състояние, защото променливата x, която е подадена отвън за анонимната функция, се използва вътре в дефиницията ѝ

Функциите с вътрешно състояние са обратния случай на комбинаторите - функции без свободни променливи.

Функция без свободни променливи е чиста анонимна функция, която се обръща само към своите аргументи.

7. Подготовка за изпит

Задaчa. 1 Цифра като дума

Напишете програма, която продължително приема едноцифрени числа за вход и ги принтира на конзолата като дума.

Вход
Изход

0

Zero

1

One

2

Two

3

Three

4

Four

5

Five

6

Six

7

Seven

8

Eight

9

Nine

При въвеждане на End програмата да спира изпълнението си. За целта - възползвайте се от библиотеката System.Exit и метода, който тя предлага exitWith, като го извикате с параметър ExitSuccess. При вход на отрицателно число или число с повече от 1 цифра да се изпише: Please only enter single digit positive numbers.

Пример

Вход
Изход

5

Five

9

Nine

11

Please only enter single digit positive numbers

End

Задача 2. Средно аритметично на цифрите на число

Напишете програма, която приема на стандартният вход цяло число и отпечатва на стандартният изход средното аритметично на неговите цифри.

  • На стандартният вход се въвежда цяло число N

  • На стандартният изход се извежда цяло число - средното аритметично на цифрите на N

Ограниения

1 <= N <= 10000

Пример

Вход
Изход

2222

2

2345

3

Задача 3. Най-малка цифра в число

Да се състави прогрма, която намира и отпечатва най-малката цифра в цяло число.

  • На стандартният вход се въвежда цяло число N

  • На стандартният изход се отпечатва цяло число M - най-малката цифра в N

Ограничения

1 <= N <= 10000

Пример

Вход
Изход

6798154

1

Last updated