Программирование
<<  Функциональное программирование Функциональное программирование  >>
Функциональное программирование
Функциональное программирование
Лекция 6
Лекция 6
Сопоставление с образцом
Сопоставление с образцом
match
match
fun vs
fun vs
Пример pattern matching
Пример pattern matching
Рекурсия
Рекурсия
Простой пример
Простой пример
#Light - синтаксис
#Light - синтаксис
Применим функциональную абстракцию
Применим функциональную абстракцию
Цикл for
Цикл for
For с аккумулятором
For с аккумулятором
Другие циклические конструкции (семинар)
Другие циклические конструкции (семинар)
Классификация рекурсии
Классификация рекурсии
Классификация рекурсии
Классификация рекурсии

Презентация на тему: «Функциональное программирование». Автор: Митя;Лена. Файл: «Функциональное программирование.ppt». Размер zip-архива: 2613 КБ.

Функциональное программирование

содержание презентации «Функциональное программирование.ppt»
СлайдТекст
1 Функциональное программирование

Функциональное программирование

Факультет инноваций и высоких технологий Московский физико-технический институт

2 Лекция 6

Лекция 6

Сопоставление с образцом. Рекурсия. Циклы

2

3 Сопоставление с образцом

Сопоставление с образцом

type document = SSN of int | Passport of string;; type personx = string * int * document;; let vasyax = ("Vasya",14,SSN 1234);; let (_,_,doc)= vasyax;;

match vasyax with _,_,SSN x -> print_int x | _,_,Passport s -> print_string s ;;

let print_doc = function _,_,SSN x -> print_int x | _,_,Passport s -> print_string s in print_doc vasyax;;

3

4 match

match

match expr with pattern1 [when cond1] -> expr1 | pattern2 [when cond2] -> expr1 | … ;;

match D with _ when D>0 -> “Два корня” | _ when D=0 -> “Один корень” | _ -> “Нет корней” ;;

match root with Some(t) -> printf “Корень: %d\n” t | None -> printf “Корней нет\n”

4

5 fun vs

fun vs

function

Конструкции для определения лямбда-выражений: fun Поддерживает несколько аргументов в каррированной форме: fun x y -> … Не поддерживает pattern matching function Поддерживает только один аргумент (возможно, tuple) Поддерживает pattern matching с несколькими вариантами описания

5

6 Пример pattern matching

Пример pattern matching

Let rec fact1 = function 1 -> 1 | x -> x*fact1(x-1);; let rec fact2 x = match x with 1 -> 1 | x -> x*fact2(x-1);; // это уже не pattern matching let rec fact3 x = if x = 1 then 1 else x * fact3(x-1);;

6

7 Рекурсия

Рекурсия

Определения в F# могут быть рекурсивными, т.е. в рамках «let rec»- определения возможно использовать определяемую функцию В ?-исчислении напрямую понятия рекурсии нет – мы позднее узнаем, как определяется рекурсия в ?-исчислении Рекурсия – зачастую единственный способ совершения итеративных действий

7

8 Простой пример

Простой пример

Напечатать числа от a до b

let rec print_n a b = if a>=b then print_int b else begin print_int a; print_n (a+1) b end;; print_n 1 10;;

8

9 #Light - синтаксис

#Light - синтаксис

Группировка по блокам регулируется отступами Можно опускать некоторые элементы синтаксиса, например, in в let … in …

#light let rec print_n a b = if a>=b then print_int b else print_int a print_n (a+1) b ;; print_n 1 10;;

9

10 Применим функциональную абстракцию

Применим функциональную абстракцию

print_n – типичная реализация цикла со счетчиком Необходимо выполнить какое-то действие несколько раз, при этом переменная-счетчик меняется от a до b Действие можно задать функцией int ? unit Функционал – функция, принимающая или возвращающая функцию

10

11 Цикл for

Цикл for

В F# (но не в других функц.языках) имеется также встроенная конструкция цикла for:

let rec forl a b f = if a>=b then f b else f a forl (a+1) b f ;; forl 1 10 (fun i -> print_int i);;

for i=1 to 10 do print_int i;; for i in 1..10 do print_int i;;

11

12 For с аккумулятором

For с аккумулятором

fora a b i f = f(f(…f(i,b),…),a+1,a)

Посчитаем сумму чисел от 1 до 10:

А сумму 1+...+x^n/n!

let rec fora a b i f = if a>=b then i else f (fora (a+1) b i f) a ;;

fora 1 10 (fun a i -> a+i);;

12

13 Другие циклические конструкции (семинар)

Другие циклические конструкции (семинар)

(* Следующее за 10 простое число *) whilel 10 (fun i -> not is_prime i);; (* sin(sin(sin(x))) *) let sin3 x = reccall 3 sin x;; let sin3 = reccall 3 sin;;

13

14 Классификация рекурсии

Классификация рекурсии

Линейная Вызов функции генерирует не более одного рекурсивного вызова Нелинейная (плохая)

fact 3

fact 3

fact 1

fib 4

let rec fib a = if a<2 then 1 else fib (a-1) + fib (a-2);;

fib 3

fib 2

fib 2

fib 1

fib 1

fib 0

14

15 Классификация рекурсии

Классификация рекурсии

Прямая Косвенная A вызывает B; B вызывает C; С вызывает A Часто встречается при построении компиляторов методом рекурсивного спуска

let rec A = … B … and B = … C … and C = … A …;;

15

«Функциональное программирование»
http://900igr.net/prezentacija/informatika/funktsionalnoe-programmirovanie-179200.html
cсылка на страницу

Программирование

31 презентация о программировании
Урок

Информатика

130 тем
Слайды
900igr.net > Презентации по информатике > Программирование > Функциональное программирование