Презентация для JuJa вебинара о том, как писать рекурсивные программы с примером о вычислении факториала и чисел Фибоначчи. Также рассказывается о поиске линейном, бинарном, в глубину и в ширину, как работает поисковая система.
Презентация сделана для новичков в деле программистов.
Olexandra Dmytrenko
QA Automating at EPAM Systems
I'll show you how to switch from writing standard code using good old Java7 into writing it using functional way presented in Java8. The training is counted on beginners in the subject who like discovering the new horizons or for those who want to become more firm in using the new lambda features.
Основы языка Питон: функции, элементы функционального программирования, списочные выражения, генераторы. Презентация к лекции курса "Технологии и языки программирования".
Olexandra Dmytrenko
QA Automating at EPAM Systems
I'll show you how to switch from writing standard code using good old Java7 into writing it using functional way presented in Java8. The training is counted on beginners in the subject who like discovering the new horizons or for those who want to become more firm in using the new lambda features.
Основы языка Питон: функции, элементы функционального программирования, списочные выражения, генераторы. Презентация к лекции курса "Технологии и языки программирования".
Developers want to make very few errors in their code and to spot them as early as possible: with the help of unit tests, or earlier, during compilation, or best of all, immediately after they typed something wrong in their IDE. This is what static code analyzers are for. Some of them are built-in, others need to be run separately, some check just about any code, the others require it to be annotated first, and there are tools that are a little bit of all. Do the ends justify the means? Is it even worth trying? What kind of errors can be spotted by static code analysis? How sure can we be if what an analyzer gives us is a real error or a false positive? This talk hopefully helps you answer these questions.
Solit 2014, EcmaScript 6 in Action, Трухин Юрий solit
Юрий Трухин, Россия. Эксперт по облачным технологиям хостинговой компании InfoboxCloud. В прошлом – обладатель статуса Microsoft Most Valuable Professional. Гик, стратег, разработчик. Подробнее на trukhin.com
«Обзор InfoboxCloud для разработчиков». Development секция. Высокий уровень подготовки. Для разработчиков.
В этом докладе будет рассказано об устройстве InfoboxCloud из первых рук, о деталях внутренней реализации, о том, какую пользу несет облако для разработчиков и о будущем InfoboxCloud. Будут рассмотрены 2 кита облачных технологий: IaaS и PaaS без vendor-lock. Отличная возможность спросить обо всём, что касается PaaS/IaaS непосредственно архитектора и разработчика этих систем.
«EcmaScript 6 in Action». Development секция. Для разработчиков.
Поговорим о том, как жизнь разработчиков изменится с приходом нового стандарта.
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
Functional Programming becomes very popular nowadays. What is it? Is it a hype or panacea? Should you deal with it as a PHP programmer? Let's find out!
Guava - open-source библиотека, разработанная в основном инженерами компании Google, в которой есть множество полезных утилит для написания эффективного и красивого кода. В Guava решено множество типичных задач, которые часто возникают при работе с примитивами, строками, коллекциями, параллельными вычислениями, кэшированием данных и многим другим. В докладе поговорим о возможностях, которые предоставляет Guava, рассмотрим примеры использования утилит библиотеки.
Занятие №3 в рамках Курсов программирования Ruby on Rails.
Группа курсов «ВКонтакте»: http://vk.com/ruby_school
Организатор — Агентство интернет-маркетинга Мэйк makeagency.ru. Курсы проводятся на базе Кузбасского государственного технического университета, кафедры «Информационные и автоматизированные производственные системы».
Solution for the reactive relational DB connection when programming using Spring WebFlux. When you want all you app to be reactive, don't make JDBC DB connection a bottlenack. Use R2DBC driver. In the presentation I share my experience on how to work with the driver, and if it is already ready to be used in serious projects on production. The talk was presented at Devoxx Ukraine, Nov 1, 2019.
The presentation from Java zone 2018 about
* how to teach programming to kids of different age,
* since which age it's good to teach programming to kids,
* ideas how to organise a lesson using a BB-8 robot
* what kids of lesson fits better to the older kids
Ideas on how to conduct a memorable programming lesson with kids are here. I've used the BB-8 robot from the Star Wars to teach children to code. It can be programmed with the Sphero Edu application installed on a phone or as a Google Chrome plugin.
There are also some general advice on how the mind of a kid gets developed, from which age it's good to give specific knowledge to kids and detailed info about 8-9 years old kids.
More on the subject you may read in the corresponding blog post: https://medium.com/@ladyInIT/kids-of-different-age-program-bb42ecb6fd06
The presentation was made for GeeCON 2018 held in Krakow.
В презентации рассказывается о структурах памяти в JVM: Heap, Non-Heap, Stack, об атомарности операций и о garbage collector. Рассмотрен пример, как работает стек. Также, приведены примеры, как использовать jVisualVM и что она может показать.
Презентация делалась для JuJa конференции - Java конференции для (пре) Juniors: https://juja.com.ua/materials/jujacon-2017/
В ней
- описываются основные темы-вопросы, которые часто спрашивают на собеседовании на позицию Junior Java Developer;
- советы, что спросить собеседующего;
- как себя позиционировать, как относиться к собеседованию, как не бояться и как понять, что вам "туда".
В презентации в легком для детей формате описано, как создать HTML таблицу, как вставить туда картинки, как изменить шрифта, как поставить ссылки. Предлагается сделать открытку родителям в виде HTML таблицы и послать по почте.
3. Рекурсия это
– замкнутый круг, мы обречены на повторение тех же
действий, но с той разницей, что входные данный можно
менять!
4. Рекурсия без шуточек
Рекурсия это решение задачи с помощью решения ее
маленьких подзадач, структура которых повторяет
структуру задачи.
Пример: вычисление факториала
0! = 1
1! = 1 =1 ⋅ 1 = 1 ⋅ 0!
2! = 2 = 2 ⋅ 1 ⋅ 1 = 2 ⋅ 1!
3! = 6 = 3 ⋅ 2 ⋅ 1 ⋅ 1 = 3 ⋅ 2!
4! = 24 = 4 ⋅ 3 ⋅ 2 ⋅ 1 ⋅ 1 = 4 ⋅ 3!
На практике это выглядит как вызов методом самого же
себя, но с другими параметрами.
6. Основные
характеристики рекурсии
1. Терминальная ветвь - часть метода или метод с
условием, которое прервет цепочку рекурсивных
вызовов и возвратит правильный результат.
Должна быть в каждой рекурсии минимум одна и
достижима за конечное число рекурсивных вызовов.
2. Глубина рекурсии - количество раз вызова
функцией себя же или аналогичной.
7. Число Эйлера
e ≈ 2,71828
Константу впервые вычислил швейцарский математик Якоб Бернулли в
ходе решения задачи о предельной величине процентного дохода.
Если исходная сумма $1 и начисляется 100% годовых один раз в конце
года, то итоговая сумма будет $2.
А если такой же процент разбить на несколько начислений, то
результирующий доход можно представить следующим образом:
8. Рекурсия в банке
Начисляется
100% на $1
Количество
начислений
за год
Начисляем ту же
прибыль несколько
раз в год
Результирующая
сумма
Начисляем в
конце года 100%
1 $1 * 200% = $1 * 2 = $2 $2
100% разбиты на
2 увеличения
2
$1 * 150% ^2 = $1 *
1.5^2 = $2.25
$2.25
100% разбиты на
квартальные
увеличения
4 $2.44
Начисляем так
часто, как клиент
пожелает
n ≈ $2.71828
9. Еще раз о факториале
• Смысл факториала - определить количество
перестановок или упорядочиваний множества из
n элементов.
Пример: n = 3, а именно A B C
1) A B C
2) A C B
3) B A C 3! =1 * 2 * 3 = 6
4) B C A
5) С A B
6) C B A
10. Факториал через цикл
public class Factorial {
public static void main(String[] args) {
int result = factorialCycle(3);
System.out.println(result);
}
private static int factorialCycle(int n) {
int factorial = 1;
for (int i = 1; i <= n; i++) {
factorial *= i;
}
return factorial;
}
}
11. Факториал через
рекурсию
public class Factorial {
public static void main(String[] args) {
int result = factorialRecursion(2);
System.out.println(result);
}
private static int factorialRecursion(int n) {
if (n > 1) {
return n * factorialRecursion(n - 1);
}
return 1;
}
}
12. Параллельная рекурсия
• Несколько функций вычисляются
и параллельно и рекурсивно.
Пример: числа Фибоначчи
Каждое следующее число равно сумме 2х предыдущих
Происхождение: Фибоначчи рассматривает развитие
идеализированной (биологически нереальной) популяции
кроликов, предполагая, что: изначально есть новорожденная
пара кроликов (самец и самка); со второго месяца после
своего рождения кролики начинают спариваться и каждый
месяц производить новую пару кроликов; кролики никогда
не умирают. Сколько пар кроликов будет через год?
13. Числа Фибоначчи
public class FibonachiNumbers {
public static void main(String[] args) {
int n = 6;
int result = fibonachi(n);
System.out.println(result);
}
private static int fibonachi(int n) {
//1, 1, 2, 3, 5, 8
if (n > 2){
return fibonachi(n - 1) + fibonachi(n - 2);
}
return 1;
}
}
14. Хвостовая рекурсия
• Хвостовая рекурсия — частный случай рекурсии,
при котором любой рекурсивный вызов является
последней операцией перед возвратом из функции.
Всегда легко может быть заменен на итерацию.
15. Еще пример рекурсии
• Способ хранения данных: связный список
• Множественная рекурсия (вызов не только одной
рекурсивной функции) - обход дерева в глубину
• Непрямая рекурсия - 2 зеркала напротив друг-друга,
класс А обращается к классу В, который вызывает
класс А.
16. За и против рекурсии,
выводы
✓Запись алгоритма может выглядеть проще, нагляднее и
понятнее
- Чревато загромождением памяти, ведь надо помнить все
предыдущие действия, чтоб идти по рекурсии.
๏ Используйте рекурсию для программ, где не будет
возникать слишком большой глубины рекурсии и
желательно для изначально рекурсивных алгоритмов.
18. Как можно искать:
Линейный поиск
Как работает: Перебор в лоб.
Главный плюс - понятно, как работает.
Не надо заранее готовить данные
Главный минус - медленно.
Особенность: в случае повторяемых значений найдет
первое
19. Линейный поиск
public static void main(String[] args) {
int[] arr = {1, 15, 8, 2, 15, 19}; // где ищем
int x = 8; // что ищем
int i = linearSearch(arr, x);
System.out.println(i);
}
public static int linearSearch(int[] arr, int x){
for (int i = 0; i < arr.length; i++) {
int element = arr[i];
if (element == x){
return i;
}
}
return -1;
}
20. Как лучше искать:
бинарный поиск
Как работает: сравнивает серединный элемент
отсортированного массива со значением, которое ищет.
Ориентируясь, где может находится нужное значение, берет
нужную часть и повторяет те же действия пока не найдет.
Или вернет ближайший индекс с минусом в случае
отсутствия элемента.
Плюс в скорости, трудоемкость
Минус в необходимости подготовить данные, что тоже
имеет трудоемкость.
Особенность: в случае повторяемых значений найдет
непонятное
22. Реализация бинарного
поиска
public class BinarySearch {
/**
* ищем индекс элемента в массиве
* или возвращаем -1, если элемента нету
*/
public static void main(String[] args) {
int[] arr = {1, 5, 8, 12, 15, 19}; // где ищем
int x = 15; // что ищем
int i = binarySearch(arr, x, 0, arr.length - 1);
System.out.println(i);
}
public static int binarySearch(int[] arr, int x, int low, int high) {
if (high < low) {
return -1; //не найдено
}
int mid = (low + high) / 2;
if (arr[mid] > x) {
//ищем в нижней части массива
return binarySearch(arr, x, low, mid - 1);
} else if (arr[mid] < x) {
//ищем в верхней части массива
return binarySearch(arr, x, mid + 1, high);
} else return mid; //найденный элемент
}
}
23. • Дерево является основой для хранения некоторых
структур данных, например дерева рода и для других
задач, где важен порядок элементов и их место, т. к.
какой соцгруппе первой давать субсидию.
• В некоторых языках программирования дерево -
основа ассоциативного массива (мапы), позволяющего
хранить пары вида «(ключ, значение)» и
поддерживающий операции добавления пары, а также
поиска и удаления пары по ключу. В стандартной
библиотеке STL языка С++ контейнер map реализован
на основе красно-чёрного дерева.
Зачем нужны деревья?
24. Поиск по хешу
• Хеш-функция - некая функция, которая на основе значения
элемента строит число. Для разных элементов число
должно быть разным, а для одинаковых - одинаковым.
Создана с целью упорядочивания элементов в массиве
данных, для ускорения поиска, ведь сравнивать числа
легко. Альтернатива дереву.
Хэш-таблицы плохи тем, что на их основе нельзя
реализовать быстро работающие дополнительные операции
MIN, MAX и алгоритм обхода всех хранимых пар в порядке
возрастания или убывания ключей.
25. Поиск в ширину
• Это обход по узлам дерева в
зависимости от их уровня.
Пример: поиск, сколько тегов/узлов
«hotel» имеется в xml документе.
26. Поиск в глубину
• Представляет собой обход
дерева по всей ветке до
последнего листочка, только
потом переход на следующую
ветку/подветку
Пример: Обход лабиринта.
27. Как работает поисковик?
1. При появлении нового ресурса она добавляется в
базу и ей приваривается поисковой индекс.
2. Странице присваивается ранг/аппетитность.
3. При вводе поискового запроса используется
словарь похожих терминов и с помощью индексов
поисковик предлагает результаты.
http://lmgtfy.com/?q=how+search+engine+works
28. Как меня найти
• Facebook: https://www.facebook.com/
olexandra.dmytrenko
• Twitter: https://twitter.com/LadyInIT
• Google+: https://plus.google.com/
104080342212951796546
• Linkedin: https://www.linkedin.com/in/olexandra-
dmytrenko-078a0330/