Модул 11. Функционално програмиране
Материали | Задачи | Решения | Видео
Съдържание
Въведение
Функции и стойности
Рекурсия
Списъци
Функции от по висок ред
Затваряне на състояние във функция
Подготовка за изпит
1. Въведение
Инсталация
Първа програма
VS Code > File > New [Ctrl + N]
VS Code > File > Save [Ctrl + S]
VS Code > Terminal > New terminal [Ctrl + Shift + `]
2. Функции и стойности
Деклариране на функция
Функция с повече параметри
Използване на скоби
Функции като стойности на функция
Композиция
Рекурсия
3. Рекурсия
В Haskell няма цикли. Циклите се реализират чрез рекурсия. Итерациите се реализират с рекурсивни извиквания. Итераторите се реализират като параметри и се променят при всяко рекурсивно извикване.
Рекурсивна реализация на цикли
За функциите, които зависят от външно състояние се използва помощна функция:
Задача
Дефинирайте функция, която намира сбора на първите 10 естествени числа.
Опашкова рекурсия
Опашковата рекурсия е рекурсия, при която последното извършвано действие е рекурсивно извикване.
Оптимизация на опашката = Tail Call Optimization
Вместо с последващо връщане рекурсивното обръщение се реализира със преход без връщане
При тази рекурсия заделената в стека памет се преизползва вместо да се заделя нова
Намалява разхода на памет и обикновено подобрява бързината на алгоритъма, но по-трудно се откриват грешки
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