0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>7 дек 2022</li>
2
<ul><li>7 дек 2022</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><h2>Что такое алгоритмы и какими они бывают</h2>
4
</ul><h2>Что такое алгоритмы и какими они бывают</h2>
5
<p>Ты можешь разрабатывать микросервисы и знать все уровни модели OSI, но какой ты программист, если не можешь объяснить ребёнку, что такое алгоритм?</p>
5
<p>Ты можешь разрабатывать микросервисы и знать все уровни модели OSI, но какой ты программист, если не можешь объяснить ребёнку, что такое алгоритм?</p>
6
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
6
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
7
<p>Пишет об истории IT, разработке и советской кибернетике. Знает Python, JavaScript и немного C++, но предпочитает писать на русском.</p>
7
<p>Пишет об истории IT, разработке и советской кибернетике. Знает Python, JavaScript и немного C++, но предпочитает писать на русском.</p>
8
<p>Ведущий бэкенд-разработчик мобильного приложения "Альфа-Банка".</p>
8
<p>Ведущий бэкенд-разработчик мобильного приложения "Альфа-Банка".</p>
9
<p>Иногда совсем простые вопросы о профессии вводят в ступор даже опытных специалистов. Примерно так происходит, когда у разработчика с 5-10-летним стажем спрашивают: "Что такое алгоритм?"</p>
9
<p>Иногда совсем простые вопросы о профессии вводят в ступор даже опытных специалистов. Примерно так происходит, когда у разработчика с 5-10-летним стажем спрашивают: "Что такое алгоритм?"</p>
10
<p>Но для того мы здесь и собрались, чтобы дать понятные ответы на "глупые" вопросы. В этой статье расскажем, что такое алгоритмы, для чего они нужны и какими бывают.</p>
10
<p>Но для того мы здесь и собрались, чтобы дать понятные ответы на "глупые" вопросы. В этой статье расскажем, что такое алгоритмы, для чего они нужны и какими бывают.</p>
11
<p>Вы узнаете:</p>
11
<p>Вы узнаете:</p>
12
<ul><li><a>Что такое алгоритмы</a></li>
12
<ul><li><a>Что такое алгоритмы</a></li>
13
<li><a>Для чего их используют</a></li>
13
<li><a>Для чего их используют</a></li>
14
<li><a>Какие у них есть свойства</a></li>
14
<li><a>Какие у них есть свойства</a></li>
15
<li><a>Что такое псевдокод</a></li>
15
<li><a>Что такое псевдокод</a></li>
16
<li><a>Что такое блок-схемы и как их рисовать</a></li>
16
<li><a>Что такое блок-схемы и как их рисовать</a></li>
17
<li><a>Примеры линейных, ветвящихся, циклических и рекурсивных алгоритмов и блок-схем</a></li>
17
<li><a>Примеры линейных, ветвящихся, циклических и рекурсивных алгоритмов и блок-схем</a></li>
18
</ul><p>В широком смысле алгоритм - это последовательность действий, которые нужно выполнить, чтобы получить определённый результат.</p>
18
</ul><p>В широком смысле алгоритм - это последовательность действий, которые нужно выполнить, чтобы получить определённый результат.</p>
19
<p>Слово "алгоритм" произошло от имени персидского математика Абу Абдуллаха аль-Хорезми. В своём труде "Китаб аль-джебр валь-мукабала" учёный впервые дал описание десятичной системы счисления. А наука алгебра получила своё название в честь его книги.</p>
19
<p>Слово "алгоритм" произошло от имени персидского математика Абу Абдуллаха аль-Хорезми. В своём труде "Китаб аль-джебр валь-мукабала" учёный впервые дал описание десятичной системы счисления. А наука алгебра получила своё название в честь его книги.</p>
20
<p>Мы часто пользуемся алгоритмами в повседневной жизни. Например, когда хотим приготовить кофе в капсульной кофемашине, руководствуемся примерно таким алгоритмом:</p>
20
<p>Мы часто пользуемся алгоритмами в повседневной жизни. Например, когда хотим приготовить кофе в капсульной кофемашине, руководствуемся примерно таким алгоритмом:</p>
21
<p>1. Устанавливаем капсулу.</p>
21
<p>1. Устанавливаем капсулу.</p>
22
<p>2. Проверяем уровень воды в специальном отсеке.</p>
22
<p>2. Проверяем уровень воды в специальном отсеке.</p>
23
<p>3. Если воды недостаточно - доливаем.</p>
23
<p>3. Если воды недостаточно - доливаем.</p>
24
<p>4. Ставим чашку под кран кофемашины.</p>
24
<p>4. Ставим чашку под кран кофемашины.</p>
25
<p>5. Запускаем кофемашину.</p>
25
<p>5. Запускаем кофемашину.</p>
26
<p>6. Выключаем кофемашину, когда чашка наполнилась.</p>
26
<p>6. Выключаем кофемашину, когда чашка наполнилась.</p>
27
<p>7. Достаём кружку.</p>
27
<p>7. Достаём кружку.</p>
28
<p>Если не перепутать порядок шагов, то с помощью такой инструкции любой сможет порадовать себя чашкой горячего кофе. Достаточно лишь знать, как установить капсулу и включить/выключить кофемашину.</p>
28
<p>Если не перепутать порядок шагов, то с помощью такой инструкции любой сможет порадовать себя чашкой горячего кофе. Достаточно лишь знать, как установить капсулу и включить/выключить кофемашину.</p>
29
<p>С компьютерами намного сложнее. Им неизвестно, что значит "установить капсулу", "долить воду", "запустить кофемашину" и так далее. Чтобы запрограммировать робота-баристу под определённую модель бытовой техники, алгоритм придётся расписать более детально:</p>
29
<p>С компьютерами намного сложнее. Им неизвестно, что значит "установить капсулу", "долить воду", "запустить кофемашину" и так далее. Чтобы запрограммировать робота-баристу под определённую модель бытовой техники, алгоритм придётся расписать более детально:</p>
30
<p>1. Возьми штепсельную вилку шнура питания кофемашины.</p>
30
<p>1. Возьми штепсельную вилку шнура питания кофемашины.</p>
31
<p>2. Вставь штепсельную вилку в розетку.</p>
31
<p>2. Вставь штепсельную вилку в розетку.</p>
32
<p>3. Проверь, есть ли вода в отсеке для воды.</p>
32
<p>3. Проверь, есть ли вода в отсеке для воды.</p>
33
<p>4. Если воды недостаточно:</p>
33
<p>4. Если воды недостаточно:</p>
34
<p>4.1. Подними крышку отсека.</p>
34
<p>4.1. Подними крышку отсека.</p>
35
<p>4.2. Возьми кувшин с водой.</p>
35
<p>4.2. Возьми кувшин с водой.</p>
36
<p>4.3. Лей воду из кувшина в отсек, пока он не заполнится.</p>
36
<p>4.3. Лей воду из кувшина в отсек, пока он не заполнится.</p>
37
<p>4.4. Закрой крышку отсека.</p>
37
<p>4.4. Закрой крышку отсека.</p>
38
<p>4.5. Поставь кувшин с водой на стол.</p>
38
<p>4.5. Поставь кувшин с водой на стол.</p>
39
<p>5. Открой крышку кофемашины.</p>
39
<p>5. Открой крышку кофемашины.</p>
40
<p>6. Возьми из коробки капсулу с кофе.</p>
40
<p>6. Возьми из коробки капсулу с кофе.</p>
41
<p>7. Вставь капсулу в отсек для капсулы.</p>
41
<p>7. Вставь капсулу в отсек для капсулы.</p>
42
<p>8. Закрой крышку кофемашины.</p>
42
<p>8. Закрой крышку кофемашины.</p>
43
<p>9. Поверни рычаг кофемашины вправо.</p>
43
<p>9. Поверни рычаг кофемашины вправо.</p>
44
<p>10. Когда чашка наполнится, поверни рычаг кофемашины влево.</p>
44
<p>10. Когда чашка наполнится, поверни рычаг кофемашины влево.</p>
45
<p>11. Возьми кружку.</p>
45
<p>11. Возьми кружку.</p>
46
<p>12. Принеси кружку хозяину.</p>
46
<p>12. Принеси кружку хозяину.</p>
47
<p>Конечно, если мы собираем робота с нуля, то даже такой детализации будет недостаточно. Каждую процедуру ещё нужно будет реализовать на языке программирования (например, на C++ или Python), что само по себе - нетривиальная задача. Тем не менее описание стало более точным и формальным.</p>
47
<p>Конечно, если мы собираем робота с нуля, то даже такой детализации будет недостаточно. Каждую процедуру ещё нужно будет реализовать на языке программирования (например, на C++ или Python), что само по себе - нетривиальная задача. Тем не менее описание стало более точным и формальным.</p>
48
<p>C научной точки зрения определение алгоритма, которое мы дали выше, не совсем точное. Ведь не всякую последовательность действий, приводящую к результату, можно назвать алгоритмом.</p>
48
<p>C научной точки зрения определение алгоритма, которое мы дали выше, не совсем точное. Ведь не всякую последовательность действий, приводящую к результату, можно назвать алгоритмом.</p>
49
<p><strong>Алгоритм в информатике</strong> - это понятный исполнителю набор правил для решения конкретного множества задач, который получает входные данные и возвращает результат за конечное время.</p>
49
<p><strong>Алгоритм в информатике</strong> - это понятный исполнителю набор правил для решения конкретного множества задач, который получает входные данные и возвращает результат за конечное время.</p>
50
<p>У алгоритмов есть два замечательных качества: они позволяют эффективно решать задачи и не изобретать решения, которые кто-то уже придумал до нас. Это справедливо как для повседневной жизни, так и для IT.</p>
50
<p>У алгоритмов есть два замечательных качества: они позволяют эффективно решать задачи и не изобретать решения, которые кто-то уже придумал до нас. Это справедливо как для повседневной жизни, так и для IT.</p>
51
<p>Представьте, что оформляете загранпаспорт. Если будете всё делать сами и без инструкции, около 40 минут потратите только на выяснение необходимых справок и порядка оформления. Куда проще воспользоваться "Госуслугами", потому что алгоритм там уже составлен - делаете, что вам говорят, и ждёте результат. А ещё проще - обратиться к посреднику, который подготовит все справки и оформит паспорт за неделю.</p>
51
<p>Представьте, что оформляете загранпаспорт. Если будете всё делать сами и без инструкции, около 40 минут потратите только на выяснение необходимых справок и порядка оформления. Куда проще воспользоваться "Госуслугами", потому что алгоритм там уже составлен - делаете, что вам говорят, и ждёте результат. А ещё проще - обратиться к посреднику, который подготовит все справки и оформит паспорт за неделю.</p>
52
<p>Это очень бытовой пример, но программирование примерно так и работает. Разработчики изучают алгоритмы, чтобы писать быстрый и эффективный код, - распознают типовую задачу и подбирают для неё оптимальный алгоритм.</p>
52
<p>Это очень бытовой пример, но программирование примерно так и работает. Разработчики изучают алгоритмы, чтобы писать быстрый и эффективный код, - распознают типовую задачу и подбирают для неё оптимальный алгоритм.</p>
53
<p>Допустим, нужно отсортировать в порядке возрастания числа в списке из 1000 элементов. Можно пройтись по списку 1000 раз: на каждой итерации находить наименьшее число и переставлять его в начало списка. В этом случае общее количество шагов будет равно 1 000 000 - современный компьютер справится с этим за секунду.</p>
53
<p>Допустим, нужно отсортировать в порядке возрастания числа в списке из 1000 элементов. Можно пройтись по списку 1000 раз: на каждой итерации находить наименьшее число и переставлять его в начало списка. В этом случае общее количество шагов будет равно 1 000 000 - современный компьютер справится с этим за секунду.</p>
54
<p>А если нужно упорядочить массив из 10 000 000 элементов? Тогда компьютеру придётся выполнить 1014 шагов, что потребует гораздо больше времени. Надо оптимизировать!</p>
54
<p>А если нужно упорядочить массив из 10 000 000 элементов? Тогда компьютеру придётся выполнить 1014 шагов, что потребует гораздо больше времени. Надо оптимизировать!</p>
55
<p>Разработчик, не сведущий в computer science, начнёт ломать голову над более эффективным решением. А опытный специалист применит алгоритм быстрой сортировки, который в среднем случае даст "время" 16 × 107 шагов.</p>
55
<p>Разработчик, не сведущий в computer science, начнёт ломать голову над более эффективным решением. А опытный специалист применит алгоритм быстрой сортировки, который в среднем случае даст "время" 16 × 107 шагов.</p>
56
<p>Знатоки скажут, что ещё проще было бы воспользоваться библиотечной функцией сортировки (например, sorted() в Python). Тем не менее даже встроенные алгоритмы бывают недостаточно эффективными и разработчикам приходится писать собственные функции для сортировки. Но это уже совсем другая история ?</p>
56
<p>Знатоки скажут, что ещё проще было бы воспользоваться библиотечной функцией сортировки (например, sorted() в Python). Тем не менее даже встроенные алгоритмы бывают недостаточно эффективными и разработчикам приходится писать собственные функции для сортировки. Но это уже совсем другая история ?</p>
57
<p>Теперь представьте: вы живёте в XX веке где-нибудь в США и зарабатываете тем, что ездите по городам и продаёте мультимиксеры. Чтобы сэкономить время и деньги, вам нужно придумать кратчайший маршрут, который позволит заехать в каждый город хотя бы один раз и вернуться обратно.</p>
57
<p>Теперь представьте: вы живёте в XX веке где-нибудь в США и зарабатываете тем, что ездите по городам и продаёте мультимиксеры. Чтобы сэкономить время и деньги, вам нужно придумать кратчайший маршрут, который позволит заехать в каждый город хотя бы один раз и вернуться обратно.</p>
58
<em>Иллюстрация: Катя Павловская для Skillbox Media</em><p>Это знаменитая задача коммивояжёра, для которой практически невозможно подобрать лучшее решение. Простой перебор здесь не поможет. Уже при 10 городах количество возможных маршрутов будет равно 3,6 млн, а при 26 - даже самым мощным компьютерам понадобится несколько миллиардов лет, чтобы перебрать все варианты.</p>
58
<em>Иллюстрация: Катя Павловская для Skillbox Media</em><p>Это знаменитая задача коммивояжёра, для которой практически невозможно подобрать лучшее решение. Простой перебор здесь не поможет. Уже при 10 городах количество возможных маршрутов будет равно 3,6 млн, а при 26 - даже самым мощным компьютерам понадобится несколько миллиардов лет, чтобы перебрать все варианты.</p>
59
<p>Тем не менее каждый день миллионы устройств решают эту задачу: смартфоны строят маршруты между городами, а маршрутизаторы рассчитывают оптимальный путь для пакетов в сети. Дело в том, что существуют специальные алгоритмы, которые дают неидеальный, но достаточно эффективный результат. И их нужно знать, если вы хотите работать в компаниях, которые создают сложные, интересные проекты.</p>
59
<p>Тем не менее каждый день миллионы устройств решают эту задачу: смартфоны строят маршруты между городами, а маршрутизаторы рассчитывают оптимальный путь для пакетов в сети. Дело в том, что существуют специальные алгоритмы, которые дают неидеальный, но достаточно эффективный результат. И их нужно знать, если вы хотите работать в компаниях, которые создают сложные, интересные проекты.</p>
60
<p>Информатик и автор классических учебников по программированию Дональд Кнут выделял следующие свойства алгоритмов:</p>
60
<p>Информатик и автор классических учебников по программированию Дональд Кнут выделял следующие свойства алгоритмов:</p>
61
<ul><li>конечность,</li>
61
<ul><li>конечность,</li>
62
<li>определённость,</li>
62
<li>определённость,</li>
63
<li>наличие ввода,</li>
63
<li>наличие ввода,</li>
64
<li>наличие вывода, или результативность,</li>
64
<li>наличие вывода, или результативность,</li>
65
<li>универсальность,</li>
65
<li>универсальность,</li>
66
<li>эффективность.</li>
66
<li>эффективность.</li>
67
</ul><p>Рассмотрим каждое подробно.</p>
67
</ul><p>Рассмотрим каждое подробно.</p>
68
<p><strong>Конечность.</strong>Алгоритм должен решать задачу за конечное число шагов. Необходимость этого критерия очевидна: программа, которая решает задачу бесконечно долго, никогда не приведёт к результату.</p>
68
<p><strong>Конечность.</strong>Алгоритм должен решать задачу за конечное число шагов. Необходимость этого критерия очевидна: программа, которая решает задачу бесконечно долго, никогда не приведёт к результату.</p>
69
<p><strong>Определённость.</strong>Исполнитель (компьютер, операционная система) должен однозначно и верно интерпретировать каждый шаг алгоритма.</p>
69
<p><strong>Определённость.</strong>Исполнитель (компьютер, операционная система) должен однозначно и верно интерпретировать каждый шаг алгоритма.</p>
70
<p><strong>Наличие ввода.</strong>Как и у математической функции, результат работы алгоритма зависит от входных данных. Например, на вход алгоритма сортировки подаётся массив чисел. А функция, рассчитывающая факториал, принимает натуральное число.</p>
70
<p><strong>Наличие ввода.</strong>Как и у математической функции, результат работы алгоритма зависит от входных данных. Например, на вход алгоритма сортировки подаётся массив чисел. А функция, рассчитывающая факториал, принимает натуральное число.</p>
71
<p><strong>Наличие вывода, или результативность.</strong>Алгоритм должен выдавать конкретный результат. Например, если мы ищем подстроку в строке и такая подстрока в ней присутствует, то на выходе мы должны получить позицию этой строки. Если такой подстроки нет - алгоритм должен вернуть соответствующее значение, например -1.</p>
71
<p><strong>Наличие вывода, или результативность.</strong>Алгоритм должен выдавать конкретный результат. Например, если мы ищем подстроку в строке и такая подстрока в ней присутствует, то на выходе мы должны получить позицию этой строки. Если такой подстроки нет - алгоритм должен вернуть соответствующее значение, например -1.</p>
72
<p><strong>Универсальность.</strong>Алгоритм должен решать задачи с разными входными данными. Например, хорошая функция для сортировки массивов должна одинаково хорошо справляться с массивами из 10, 100 и 1 000 000 элементов.</p>
72
<p><strong>Универсальность.</strong>Алгоритм должен решать задачи с разными входными данными. Например, хорошая функция для сортировки массивов должна одинаково хорошо справляться с массивами из 10, 100 и 1 000 000 элементов.</p>
73
<p><strong>Эффективность.</strong>Это требование продиктовано ограниченными ресурсами компьютеров. На заре развития вычислительной техники каждая секунда работы процессора, каждый байт памяти были на счету. И хотя современные компьютеры гораздо мощнее своих предшественников, они тоже могут "тормозить" из-за неэффективных алгоритмов.</p>
73
<p><strong>Эффективность.</strong>Это требование продиктовано ограниченными ресурсами компьютеров. На заре развития вычислительной техники каждая секунда работы процессора, каждый байт памяти были на счету. И хотя современные компьютеры гораздо мощнее своих предшественников, они тоже могут "тормозить" из-за неэффективных алгоритмов.</p>
74
<p>Представьте, что вы изучили какой-нибудь язык программирования, например Go, и устроились бэкенд-разработчиком в IT-компанию. В вашей команде, помимо бэкендеров, есть фронтенд-разработчики, которые пишут код на JavaScript.</p>
74
<p>Представьте, что вы изучили какой-нибудь язык программирования, например Go, и устроились бэкенд-разработчиком в IT-компанию. В вашей команде, помимо бэкендеров, есть фронтенд-разработчики, которые пишут код на JavaScript.</p>
75
<p>Вы придумали крутой алгоритм, который ускорит работу приложения, и хотите рассказать о нём коллегам. Но как это сделать, если они программируют на другом языке?</p>
75
<p>Вы придумали крутой алгоритм, который ускорит работу приложения, и хотите рассказать о нём коллегам. Но как это сделать, если они программируют на другом языке?</p>
76
<p>Для таких ситуаций есть<strong>псевдокод</strong>. Он позволяет изложить логику программы с помощью понятных для всех команд, не углубляясь в детали реализации конкретного языка. В учебной литературе алгоритмы описывают в основном с помощью псевдокода.</p>
76
<p>Для таких ситуаций есть<strong>псевдокод</strong>. Он позволяет изложить логику программы с помощью понятных для всех команд, не углубляясь в детали реализации конкретного языка. В учебной литературе алгоритмы описывают в основном с помощью псевдокода.</p>
77
<p>У псевдокода нет общепринятых стандартов, и авторы используют собственные оригинальные нотации. Хотя часто они заимствуют названия операций из Python, Pascal и Java. Например, код ниже напоминает программу на Python:</p>
77
<p>У псевдокода нет общепринятых стандартов, и авторы используют собственные оригинальные нотации. Хотя часто они заимствуют названия операций из Python, Pascal и Java. Например, код ниже напоминает программу на Python:</p>
78
int linear_search(int[] arr, int x): if arr is empty: return -1 for i in 0..n: if arr[i] == x: return i return -1<p>Также псевдокод можно писать на русском языке, как в школьных учебниках по информатике:</p>
78
int linear_search(int[] arr, int x): if arr is empty: return -1 for i in 0..n: if arr[i] == x: return i return -1<p>Также псевдокод можно писать на русском языке, как в школьных учебниках по информатике:</p>
79
<p>ФУНКЦИЯ линейный_поиск(целое[]<strong>массив</strong>, целое<strong>x</strong>):</p>
79
<p>ФУНКЦИЯ линейный_поиск(целое[]<strong>массив</strong>, целое<strong>x</strong>):</p>
80
<p> ЕСЛИ<strong>массив</strong>ПУСТОЙ:</p>
80
<p> ЕСЛИ<strong>массив</strong>ПУСТОЙ:</p>
81
<p> ВЕРНУТЬ -1</p>
81
<p> ВЕРНУТЬ -1</p>
82
<p> ДЛЯ<strong>i</strong>В ДИАПАЗОНЕ ОТ <strong>0</strong>ДО ДЛИНА(<strong>массив</strong>):</p>
82
<p> ДЛЯ<strong>i</strong>В ДИАПАЗОНЕ ОТ <strong>0</strong>ДО ДЛИНА(<strong>массив</strong>):</p>
83
<p> ЕСЛИ<strong>массив[x]</strong>РАВНО<strong>x</strong>:</p>
83
<p> ЕСЛИ<strong>массив[x]</strong>РАВНО<strong>x</strong>:</p>
84
<p> ВЕРНУТЬ<strong>i</strong></p>
84
<p> ВЕРНУТЬ<strong>i</strong></p>
85
<p><strong></strong> ВЕРНУТЬ<strong>-1</strong></p>
85
<p><strong></strong> ВЕРНУТЬ<strong>-1</strong></p>
86
<p>Главное - чтобы тот, кто читает ваш алгоритм, понял его и воспроизвёл на своём языке программирования.</p>
86
<p>Главное - чтобы тот, кто читает ваш алгоритм, понял его и воспроизвёл на своём языке программирования.</p>
87
<p>Если у вас в школе были уроки по информатике, то вы наверняка рисовали и читали блок-схемы. Если нет, то знайте: алгоритмы можно описывать не только словесно, но и графически.</p>
87
<p>Если у вас в школе были уроки по информатике, то вы наверняка рисовали и читали блок-схемы. Если нет, то знайте: алгоритмы можно описывать не только словесно, но и графически.</p>
88
<p>Блок-схемы - это геометрические фигуры, соединённые между собой стрелками. Овалы, прямоугольники, ромбы и другие фигуры обозначают отдельные шаги алгоритма, а стрелки указывают направление потока данных. При этом в каждый блок записывается команда в виде логического или математического выражения.</p>
88
<p>Блок-схемы - это геометрические фигуры, соединённые между собой стрелками. Овалы, прямоугольники, ромбы и другие фигуры обозначают отдельные шаги алгоритма, а стрелки указывают направление потока данных. При этом в каждый блок записывается команда в виде логического или математического выражения.</p>
89
<p>В таблице ниже представлены основные элементы блок-схем:</p>
89
<p>В таблице ниже представлены основные элементы блок-схем:</p>
90
<p><strong>Графическое изображение</strong></p>
90
<p><strong>Графическое изображение</strong></p>
91
<p><strong>Значение</strong></p>
91
<p><strong>Значение</strong></p>
92
<p><strong>Элемент кода в Python</strong></p>
92
<p><strong>Элемент кода в Python</strong></p>
93
<p>Начало/конец программы</p>
93
<p>Начало/конец программы</p>
94
<p>Никак не обозначаетсяили обозначается как начало функции:</p>
94
<p>Никак не обозначаетсяили обозначается как начало функции:</p>
95
def foo(x): #код<p>Конец функции обозначается словом return</p>
95
def foo(x): #код<p>Конец функции обозначается словом return</p>
96
<p>Ввод/вывод данных</p>
96
<p>Ввод/вывод данных</p>
97
<p>Операторы ввода и вывода:</p>
97
<p>Операторы ввода и вывода:</p>
98
print("Hello!") word = input()<p>Арифметические операции</p>
98
print("Hello!") word = input()<p>Арифметические операции</p>
99
<p>Арифметические операторы:</p>
99
<p>Арифметические операторы:</p>
100
100 - 10 25 + 100 6 * 12.0<p>Условие</p>
100
100 - 10 25 + 100 6 * 12.0<p>Условие</p>
101
<p>Условный оператор:</p>
101
<p>Условный оператор:</p>
102
if n < 5: sum += 10<p>Цикл со счётчиком</p>
102
if n < 5: sum += 10<p>Цикл со счётчиком</p>
103
<p>Цикл for:</p>
103
<p>Цикл for:</p>
104
for k,v in enumerate(arr): print(k, v)<p>Ввод/вывод в файл</p>
104
for k,v in enumerate(arr): print(k, v)<p>Ввод/вывод в файл</p>
105
<p>Функции для работы с файлами:</p>
105
<p>Функции для работы с файлами:</p>
106
f = open("text.txt", 'r') f.close()<p>С помощью этого нехитрого набора фигур можно нарисовать схему практически любого алгоритма. Другие фигуры блок-схем вы найдёте в документации к <a>ГОСТ 19.701-90</a>.</p>
106
f = open("text.txt", 'r') f.close()<p>С помощью этого нехитрого набора фигур можно нарисовать схему практически любого алгоритма. Другие фигуры блок-схем вы найдёте в документации к <a>ГОСТ 19.701-90</a>.</p>
107
<p>Блок-схемы можно рисовать в Microsoft Visio и в Google Docs (<strong>Вставка</strong>→<strong>Рисунок</strong>→<strong>Новый +</strong>). Также есть специальные сервисы: например, облачный<a>Draw.io</a>и десктопные<a>Dia</a>и <a>yEd</a>.</p>
107
<p>Блок-схемы можно рисовать в Microsoft Visio и в Google Docs (<strong>Вставка</strong>→<strong>Рисунок</strong>→<strong>Новый +</strong>). Также есть специальные сервисы: например, облачный<a>Draw.io</a>и десктопные<a>Dia</a>и <a>yEd</a>.</p>
108
<p>А теперь разберёмся, какими бывают алгоритмы, напишем примеры на Python и нарисуем для них блок-схемы.</p>
108
<p>А теперь разберёмся, какими бывают алгоритмы, напишем примеры на Python и нарисуем для них блок-схемы.</p>
109
<p>По конструкции алгоритмы можно разделить на несколько групп.</p>
109
<p>По конструкции алгоритмы можно разделить на несколько групп.</p>
110
<p>В линейных алгоритмах действия идут последовательно, одно за другим. Такие программы - самые простые, но на практике они встречаются редко.</p>
110
<p>В линейных алгоритмах действия идут последовательно, одно за другим. Такие программы - самые простые, но на практике они встречаются редко.</p>
111
<p><strong>Пример.</strong>Напишите программу, которая умножает число, введённое пользователем, на 100 и выводит результат на экран.</p>
111
<p><strong>Пример.</strong>Напишите программу, которая умножает число, введённое пользователем, на 100 и выводит результат на экран.</p>
112
<p>Последовательность действий уже изложена в задании: ввести число → умножить на 100 → вывести результат. Переведём это на язык блок-схем:</p>
112
<p>Последовательность действий уже изложена в задании: ввести число → умножить на 100 → вывести результат. Переведём это на язык блок-схем:</p>
113
<em>Изображение: Skillbox Media</em><p>Ниже приведена реализация алгоритма на языке Python:</p>
113
<em>Изображение: Skillbox Media</em><p>Ниже приведена реализация алгоритма на языке Python:</p>
114
x = int(input()) x = x * 100 print(x) >>> 5 >>> 500<p>В ветвящихся алгоритмах ход программы зависит от значения логического выражения в блоке "Условие". По большому счёту, любое логическое выражение сводится к выбору между истиной (True, "1") или ложью (False, "0").</p>
114
x = int(input()) x = x * 100 print(x) >>> 5 >>> 500<p>В ветвящихся алгоритмах ход программы зависит от значения логического выражения в блоке "Условие". По большому счёту, любое логическое выражение сводится к выбору между истиной (True, "1") или ложью (False, "0").</p>
115
<p><strong>Пример.</strong>Напишите программу, которая запрашивает у пользователя возраст. Если он равен или больше 18, программа выводит приветствие, увеличивает значения счётчика посетителей на 1 и прощается, а если меньше - сразу прощается и завершает работу.</p>
115
<p><strong>Пример.</strong>Напишите программу, которая запрашивает у пользователя возраст. Если он равен или больше 18, программа выводит приветствие, увеличивает значения счётчика посетителей на 1 и прощается, а если меньше - сразу прощается и завершает работу.</p>
116
<p>Чтобы изобразить ход решения, воспользуемся условным блоком. Во всех схемах его обозначают ромбом с вписанным условием:</p>
116
<p>Чтобы изобразить ход решения, воспользуемся условным блоком. Во всех схемах его обозначают ромбом с вписанным условием:</p>
117
<em>Изображение: Skillbox Media</em><p>То же самое на Python:</p>
117
<em>Изображение: Skillbox Media</em><p>То же самое на Python:</p>
118
visits_counter = 0 answer = int(input("Сколько вам лет? ")) if answer >= 18: print("Добро пожаловать!") visits_counter += 1 else: print("Доступ запрещён")<p>Когда пользователь вводит 18 или больше, программа выполняет часть кода, которая записана под оператором if. Если же возраст меньше 18, то на экран выводится сообщение "Доступ запрещён" и программа завершает работу.</p>
118
visits_counter = 0 answer = int(input("Сколько вам лет? ")) if answer >= 18: print("Добро пожаловать!") visits_counter += 1 else: print("Доступ запрещён")<p>Когда пользователь вводит 18 или больше, программа выполняет часть кода, которая записана под оператором if. Если же возраст меньше 18, то на экран выводится сообщение "Доступ запрещён" и программа завершает работу.</p>
119
<p>Такие алгоритмы содержат циклы - наборы действий, которые выполняются несколько раз. Количество повторений может задаваться целым числом или условием. В некоторых случаях, например, в операционных системах и прошивках микроконтроллеров, используются бесконечные циклы.</p>
119
<p>Такие алгоритмы содержат циклы - наборы действий, которые выполняются несколько раз. Количество повторений может задаваться целым числом или условием. В некоторых случаях, например, в операционных системах и прошивках микроконтроллеров, используются бесконечные циклы.</p>
120
<p><strong>Пример.</strong>Напишите программу, которая циклично увеличивает значения счётчика на 1 и на каждом шаге выводит его значение. Когда значение счётчика достигнет 10, программа должна завершиться.</p>
120
<p><strong>Пример.</strong>Напишите программу, которая циклично увеличивает значения счётчика на 1 и на каждом шаге выводит его значение. Когда значение счётчика достигнет 10, программа должна завершиться.</p>
121
<p>В основе нашего решения будет лежать следующее условие: если значение счётчика меньше 10 - прибавить 1, иначе - завершить работу. Вот как это выглядит в виде блок-схемы:</p>
121
<p>В основе нашего решения будет лежать следующее условие: если значение счётчика меньше 10 - прибавить 1, иначе - завершить работу. Вот как это выглядит в виде блок-схемы:</p>
122
<em>Изображение: Skillbox Media</em><p>Переведём это в код на Python. Обратите внимание, что мы не прописываем отдельную ветвь для случая "Нет":</p>
122
<em>Изображение: Skillbox Media</em><p>Переведём это в код на Python. Обратите внимание, что мы не прописываем отдельную ветвь для случая "Нет":</p>
123
count = 0 #прибавлять 1 к count, пока count меньше 10 while count < 10: count += 1 print(count) print("Переменная count равна 10!")<p>Результат работы программы:</p>
123
count = 0 #прибавлять 1 к count, пока count меньше 10 while count < 10: count += 1 print(count) print("Переменная count равна 10!")<p>Результат работы программы:</p>
124
1 2 3 4 5 6 7 8 9 10<p>Рекурсия - это явление, при котором система вызывает саму себя, но с другими входными данными. Такие алгоритмы используют для обхода словарей в глубину, вычисления факториала, расчёта степеней и других практических задач. В целом всё это можно сделать с помощью циклов, но код рекурсивных функций более лаконичен и удобочитаем.</p>
124
1 2 3 4 5 6 7 8 9 10<p>Рекурсия - это явление, при котором система вызывает саму себя, но с другими входными данными. Такие алгоритмы используют для обхода словарей в глубину, вычисления факториала, расчёта степеней и других практических задач. В целом всё это можно сделать с помощью циклов, но код рекурсивных функций более лаконичен и удобочитаем.</p>
125
<p><strong>Пример.</strong>Пользователь вводит число n. Посчитайте его факториал и выведите результат на экран.</p>
125
<p><strong>Пример.</strong>Пользователь вводит число n. Посчитайте его факториал и выведите результат на экран.</p>
126
#функция, которая вызывает саму себя def factorial(n): if n == 1: return 1 #когда функция возвращает значение, #она вызывает себя, но с аргументом n - 1 return n * factorial(n - 1)<p>Вот как выглядит блок-схема рекурсивного алгоритма:</p>
126
#функция, которая вызывает саму себя def factorial(n): if n == 1: return 1 #когда функция возвращает значение, #она вызывает себя, но с аргументом n - 1 return n * factorial(n - 1)<p>Вот как выглядит блок-схема рекурсивного алгоритма:</p>
127
<em>Изображение: Skillbox Media</em><p>На практике чисто последовательные, условные или циклические алгоритмы встречаются редко, но вместе они позволяют создать решение любой сложности.</p>
127
<em>Изображение: Skillbox Media</em><p>На практике чисто последовательные, условные или циклические алгоритмы встречаются редко, но вместе они позволяют создать решение любой сложности.</p>
128
<p>Есть и другие классификации алгоритмов. Например, по множеству решаемых задач их можно разделить на численные, поисковые, сортировочные, строковые, сетевые и криптографические. А по точности получаемых результатов - на нормальные и стохастические (вероятностные).</p>
128
<p>Есть и другие классификации алгоритмов. Например, по множеству решаемых задач их можно разделить на численные, поисковые, сортировочные, строковые, сетевые и криптографические. А по точности получаемых результатов - на нормальные и стохастические (вероятностные).</p>
129
<p>Если хотите изучить алгоритмы более подробно, начните с простых и увлекательных книг по computer science:</p>
129
<p>Если хотите изучить алгоритмы более подробно, начните с простых и увлекательных книг по computer science:</p>
130
<ul><li>"Грокаем алгоритмы", Адитья Бхаргава;</li>
130
<ul><li>"Грокаем алгоритмы", Адитья Бхаргава;</li>
131
<li>"Теоретический минимум по Computer Science", Владстон Фило;</li>
131
<li>"Теоретический минимум по Computer Science", Владстон Фило;</li>
132
<li>"Гид по Computer Science", Вильям Спрингер.</li>
132
<li>"Гид по Computer Science", Вильям Спрингер.</li>
133
</ul><p>Когда познакомитесь с основными алгоритмами и научитесь решать с их помощью стандартные задачи, переходите к более серьёзной литературе. Например, прочитайте Computer Science Роберта Седжвика и "Алгоритмы" Рода Стивенса.</p>
133
</ul><p>Когда познакомитесь с основными алгоритмами и научитесь решать с их помощью стандартные задачи, переходите к более серьёзной литературе. Например, прочитайте Computer Science Роберта Седжвика и "Алгоритмы" Рода Стивенса.</p>
134
<p>У "Яндекса" есть<a>бесплатные тренировки</a>с разбором алгоритмических задач и распространённых ошибок. А попрактиковаться, закрепить теорию и подготовиться к техническому интервью можно на <a>LeetCode</a> - там есть сотни задач разной сложности и для разных языков программирования.</p>
134
<p>У "Яндекса" есть<a>бесплатные тренировки</a>с разбором алгоритмических задач и распространённых ошибок. А попрактиковаться, закрепить теорию и подготовиться к техническому интервью можно на <a>LeetCode</a> - там есть сотни задач разной сложности и для разных языков программирования.</p>
135
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
135
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>