1 Д.з. 1+1/(1+1/(1+…)) f n = 1+1/(1+1/(1+…)) f (n-1) f 0 = 1 f n = 1 + 1/f (n-1) 2 φ = 1.618…

Презентация:



Advertisements
Похожие презентации
1 Д.з. 2 maxlist Не совсем правильное решение maxlist [x] = x maxlist (x:xs) = if x > maxlist xs then x else maxlist xs maxlist [1..100] – очень долго.
Advertisements

1 Д.з. isosc – типичные замечания… 1. Считаем длину: sqrt ((x1-x2)^2 + (y1-y2)^2) sqrt не надо! 2. if (x1-x2)^2 + (y1-y2)^2 == (x1-x3)^2 + (y1-y3)^2 ||
1 Д.з. minlist - 1 Большинство решало так: minlist (x:xs) = minlist xs x minlist [] m = m minlist (x:xs) m = if x < m then minlist xs x else minlist xs.
1 Д.з. Shape – типичные ошибки contains (Circle r x y) a b = if (sqrt ((x-a)^2+(y-b)^2)) Double contains:: a -> Double -> Double -> Bool instance Shape.
1 Программирование на языке Паскаль Ветвления. 2 Разветвляющиеся алгоритмы Задача. Ввести два целых числа и вывести на экран наибольшее из них. Идея решения:
Информатика ЕГЭ Уровень А5. Вариант 1 Определите значения переменных a, b, c после выполнения следующего фрагмента программы: a:=5; b:=1; a:=a+b; if a>10.
1 Уничтожение радикалов Рогозина Елена Геннадьевна Санкт-Петербургский центр подготовки спасателей ПУ-97.
1 Д.з.. coins Решение 1 coins n = [[i, k, j] | i<-[0..n], j<-[0..n], k<-[0..n], i*2+j*3+k*5 == n] Решение 2 coins n = [[i, k, j] | i<-[0.. n `div` 2],
1 Программирование на языке Паскаль Циклы. 2 Цикл – это многократное выполнение одинаковой последовательности действий. цикл с известным числом шагов.
Про контрольную 1. Задача 5 (про data) Пусть в нашей программе мы хотим хранить информацию о телевизионных фильмах. Телевизионная передача может быть.
1 Программирование на языке Паскаль Тема 1. Введение.
1 Программирование на языке Паскаль Тема 4. Циклы.
Тема урока Переменная. Тип данных. Ввод и вывод данных.
Рекурсивная обработка списков1 Структуры и алгоритмы обработки данных, 1 Лекция 3 Рекурсивная обработка списков 1.Представление и реализация.
1 Массивы 2 Опр. Массивом называется совокупность однотипных данных, связанных общим именем. Основные характеристики массива: 1. Имя массива 2. Тип компонентов.
Программирование на Basic МассивыПрограммирование на Basic Массивы.
1 Программирование на языке Паскаль Тема 1. Введение Кулебякин В.В.
Д.з Язык С++ - занятие 31. Задача 1: 1/1 + 1/3 + 1/5 … #include using namespace std; int main() { int n; cin >> n; double sum = 0;// Сумма for.
К. Поляков, Программирование на алгоритмическом языке Тема 1. Введение.
Массивы 9 класс. Основные теоретические сведения Примеры решения задач.
Транксрипт:

1 Д.з.

1+1/(1+1/(1+…)) f n = 1+1/(1+1/(1+…)) f (n-1) f 0 = 1 f n = 1 + 1/f (n-1) 2 φ = 1.618…

Золотое сечение 3 Такой предмет у вас в сумке?

0+1/(1+1/(2+1/3+…)) b n = 0+1/(1+1/(2+1/3+…)) При трудностях помогает доп.параметр b k n = k+1/(k+1+1/(...+1/n))) b n = b' 0 n b' k n = if (k == n) then n else k + 1 / b' (k+1) n 4

5 sumsin sin( n)/(sin 1+sin sin n) Накапливающие параметры s1 s2 0 1 sin sin 1 + sin sin 1 + sin 2 + sin 3 … sumsin n = sumsin' n 0 0 sumsin' 0 s1 s2 = sin s1 / s2 sumsin' n s1 s2 = sumsin' (n-1) (s1+n) (s2+sin n)

6 sumfact 1!+2!+3!+…+n! Желательно O(n) i ps *2 1+1*2 4 1*2*3 1+1*2+1*2*3 5 1*2*3*4 1+1*2+1*2*3+1*2*3*4 sumfact n = sumfact' n sumfact' 0 i p s = s sumfact' n i p s = sumfact' (n-1) (i+1) (p*i) (s+p*i)

7 Безымянная переменная (wildcard) sumfact' 0 i p s = s Лучше так: sumfact' 0 _ _ s = s _ - безымянная переменная (wildcard) Только слева от =

8 let sumfact' n i p s = sumfact' (n-1) (i+1) (p*i) (s+p*i) Еще одна проблема (небольшая в данном случае) p*i – два раза DRY (Dont Repeat Yourself) sumfact' n i p s = let p1 = p*i in sumfact' (n-1) (i+1) p1 (s+p1)

9 let в общем случае Двумерный синтаксис let правило1 правило2 … in выражение М.б. частью выражения f n = 1 + let i = 55 j = n*n + 5* n + 8 g k = k * j in g n * 2 Где кончается правило и начинается следующее? Двумерный синтаксис (off- side rule) Запоминаем позицию первой лексемы после let (i в примере) Правее продолжение правила На том же уровне новое правило Левее конец конструкции

10 Явное задание синтаксиса let правило1 правило2 … in выражение Можно использовать { ; }, тогда отступы не имеют значение let {правило1; правило2; правило3} in выражение

where sumfact' n i p s = sumfact' (n-1) (i+1) p1 (s+p1) where p1 = p*i левая часть = правая часть where вспомогательные определения Разница: let можно писать где угодно where – часть правила Тоже двумерный синтаксис 11

Забыл сказать Можно определять свои операторы i j = i*i + j*j Пример вызова 5 7 Может использоваться любая последовательность символов (кроме зарезервированных типа -> и ::) Обычные функции можно использовать, как инфиксный оператор Надо взять в обратные кавычки (`) i `mod`

Refential transparency Что такое побочный эффект? Прозрачность по ссылкам (referential transparency) … f 5 + … f 5 … Вызовы с одинаковыми параметрами всегда дают одинаковые значения Можно заменить на один вызов (с помощью let, например) Не очень понятно: А как же случайные числа?? А как же ввод/вывод?? 13

Списки 14

Списки Основной тип данных (и почти во всех функциональных языках) Примеры: [1, 2, 3] [3.5, 2.123, 98.14] [True, False] Элементы д.б. одного типа! [1, True, 2] -- Ошибка! 15

Как создавать списки Оператор : Оператор : Приписать элемент в начало 1 : [2,3] [1,2,3] Пример: f 0 = [] f n = n : f (n-1) Список чисел от n до 1 Кстати: [a..b] – числа от a до b с шагом 1 На самом деле, [1,2,3] – это просто сокращение! [1, 2, 3] – сокращение для 1:2:3:[] Так и хранится: : / \ 1 : / \ 2 : / \ 3 [] 16

Как обрабатывать списки – способ 1 head – первый элемент списка tail – все, кроме первого элемента («хвост») head [1,2,3] 1 tail [1,2,3] [2,3] 17 Пример: сумма элементов списка sum [] = 0 sum xs = head xs + sum(tail xs) Замечания: Типичные имена для списков в Haskel: xs, ys и т.д. sum – на самом деле, есть такая стандартная фунцкия

Шаблоны Как обрабатывать списки – способ 2 sum [] = 0 sum (x:xs) = x + sum xs Слева от = м.б. выражение с переменными – шаблон (pattern) Шаблоны м.б. довольно сложным Примеры: f [x, y, z] f [1, y, 2] f (x:y:xs) f (x:1:xs) Замечания: sum (x:xs) – скобки нужны! Еще раз, правило линейности: f [x, y, x] -- ошибка! 18

Еще пример product – произведение чисел списка (стандартная функция) product [] = 1 product (x:xs) = x * product xs Снова факториал fact n = product [1..n] Это стиль Haskell! Fritz Rueh The Evolution of a Haskell Programmer uehr/haskell/evolution.html uehr/haskell/evolution.html 19

++ Еще одна стандартная функция Конкатенация [1,2] ++ [3,4] [1,2,3,4] [] ++ ys = ys (x:xs) ++ ys = x : (xs ++ ys) Кстати: как приписывать в конец списка xs : x Нет! : приписывает только в начало! xs ++ x Нет! ++ работает только со списками! xs ++ [x] OK Но O(n) – медленно! 20

Функции высшего порядка 21

Пример: map Взять синус от всех элементов списка sinAll [] = [] sinAll (x:xs) = sin x : sinAll xs Взять косинус от всех элементов списка cosAll [] = [] cosAll (x:xs) = cos x : cosAll xs Возвести все элементы списка в квадрат DRY :( Надо что-то делать! map map f [] = [] map f (x:xs) = f x : map f xs Примеры вызова map sin [1,2,3] [sin 1, sin 2, sin 3] map sqr [1,2,3] [1,4,9] Функция высшего порядка! 22

Лямбда-выражения Почему в обычных языках (Паскаль, C) этим мало пользуются? Еще задача: Каждое число в списке умножить на 10 и прибавить 5. f x = 10 * x + 5 map f xs Надо описывать вспомогательные функции – лень Надо придумывать имена – тоже лень Лямбда-выражение – функция без имени \i -> 10*x + 5 map (\i -> 10*i+5) xs Синтаксис: \ параметр1 параметр2 -> выражение \ - то, что осталось от λ Ограничения: М.б. только одно правило (но case) Естественно, не м.б. рекурсивно 23

А также.. Еще мы прошли: Решение задачи про разложение на слагаемые Пары и наборы (tuples) и работу с ними Слайды на эту тему будут в следующей презентации, заодно вкратце еще раз все это повторим 24

Д.з. 25

Д.з Описать функцию minlist, которая ищет минимальный элемент в данном списке. 2. Описать функцию minsum, которая ищет минимум суммы двух стоящих рядом элементов в данном списке. minsum [1,8,3,2,7] Ответ должен быть равен 5 (3+2) 3. Описать фунццию rev, которая для списка возвращает список из тех же элементов, но идуших в обратном порядке. rev [1, 3, 7] [7, 3, 1] O(n), если получится 26

Д.з Описать функцию check cond xs, верно ли, что есть элемент, для которого выполняется cond Примеры вызова: check (\x->x>5) [3,2,7,4] True check (\x->x>10) [3,2,7,4] False 5. Описать функцию checkDifferent, которая возвращает True, если все элементы в списке разные Примеры вызова: checkDifferent [3,2,7] True. checkDifferent [3,2,7,5,7,8] False 27