С++ для 8 класса, урок №22 (Генерация комбинаций)

YOUTUBE · 30.11.2025 04:47

Ключевые темы и таймкоды

Рекурсия и генерация комбинаторных объектов

0:03
  • Видео объясняет, что такое рекурсия и как она работает, используя пример с ханойскими башнями.
  • Рекурсия - это разделение задачи на под-задачи, аналогичные исходной задаче, но проще.

Синхронный вызов функций и стек вызовов

5:47
  • Рекурсия строится на синхронном вызове функций, где вызывающая сторона передает управление вызываемой функции и получает его обратно только после возврата управления и значения.
  • Синхронный вызов отслеживается с помощью стека вызовов, который содержит адреса возврата функций.

Применение рекурсии для генерации комбинаторных объектов

10:20
  • Автор объясняет, как использовать рекурсию для генерации комбинаторных объектов, таких как двоичные числа заданной длины.
  • Функция генератора чисел вызывает сама себя два раза, передавая длину и префикс, который содержит уже некоторое количество двоичных цифр.
  • В крайних случаях функция просто печатает полученное число.

Создание генератора комбинаций

12:41
  • Автор объясняет, как создать генератор комбинаций, который будет генерировать все возможные комбинации чисел, начиная с заданного префикса.
  • Он использует рекурсию для генерации комбинаций и объясняет, как обрабатывать крайние случаи, когда число комбинаций становится слишком большим.

Демонстрация работы генератора

20:38
  • Автор демонстрирует работу генератора, который генерирует все возможные комбинации двоичных чисел длиной до четырех разрядов.
  • Он также показывает, как можно изменить порядок генерации комбинаций, используя разные префиксы.

Генерация чисел в произвольной системе счисления

24:05
  • Автор предлагает идею использования цикла для генерации чисел в произвольной системе счисления.
  • Он предлагает хранить числа в виде строк или векторов чисел, чтобы упростить процесс генерации.

Создание вектора интов

26:08
  • Создание вектора интов, вектора диджис, с использованием системы счисления.
  • Передача ссылки на вектор для генерации чисел.

Распечатка диджитов

32:01
  • Использование цикла for для распечатки диджитов.
  • Создание экземпляра вектора для передачи в функцию.

Генерация всевозможных чисел заданной длины

36:29
  • Создание комбинаторной генерации чисел заданной длины.
  • Вывод чисел в виде цифр от эй-би-си и т.д.

Генерация всевозможных перестановок

39:24
  • Создание перестановок чисел заданной длины.
  • Ветвление на каждом уровне для генерации возможных комбинаций.

Перестановки и их генерация

41:36
  • Видео объясняет, что перестановка - это размещение цифр без повторений в трех позициях.
  • Приводится пример с цифрами 0, 1, 2, где возможны различные перестановки: 012, 021, 102, 120, 201, 210.
  • Идея состоит в том, чтобы генерировать все возможные перестановки, начиная с нуля, и затем перебирать все перестановки, начинающиеся с единицы и двойки.

Разбиение задачи на подзадачи

46:36
  • Автор предлагает разбить задачу на подзадачи: сгенерировать все возможные перестановки двух чисел, затем всех возможных перестановок одного числа.
  • Это позволяет разбить множество возможных комбинаторных объектов на подгруппы, аналогичные исходной задаче.

Отсечение бесплодных ветвей

48:51
  • Автор объясняет, что при генерации перестановок необходимо отсекать бесплодные ветви, чтобы не тратить время на перебор заведомо забракованных вариантов.
  • Это позволяет сократить количество вызовов функции и ускорить процесс генерации.

Генерация перестановок без системы счисления

51:06
  • Автор объясняет, что теперь ему не нужно основание системы счисления, так как он работает с перестановками, а не цифрами.
  • Он предлагает назвать функцию "ген" для генерации перестановок и использовать ее для печати всех возможных перестановок длины три.

Генерация всех перестановок чисел

54:20
  • Автор объясняет, как использовать рекурсию для генерации всех перестановок чисел.
  • Он использует алгоритм для проверки, использовалось ли уже определенное число в перестановке, и если нет, добавляет его в список.

Пример работы алгоритма

1:00:52
  • Автор демонстрирует, как работает алгоритм на примере генерации всех перестановок чисел от 0 до 2.
  • Он показывает, как можно использовать рекурсию для решения сложных задач, таких как комбинаторный взрыв.

Применение рекурсии для математических функций

1:08:22
  • Автор обсуждает, как использовать рекурсию для математических функций, таких как наибольший общий делитель.
  • Он объясняет, как алгоритм евклида может быть использован для разбиения задачи на под-задачи.

Алгоритм Евклида

1:11:33
  • Обсуждение алгоритма Евклида и ускорения его работы за счет взятия остатка.
  • Создание функции для вычисления наибольшего общего делителя двух чисел.

Упрощение алгоритма

1:19:00
  • Использование взятия остатка для упрощения алгоритма.
  • Обмен параметров для ускорения работы функции.
  • Использование тернарного оператора для упрощения кода.

Примеры работы алгоритма

1:21:23
  • Примеры работы алгоритма с различными числами.
  • Обсуждение эффективности и корректности работы алгоритма.

Рекурентное возведение в степень

1:23:41
  • Обсуждается проблема вычисления a в степени n, где a - вещественное число, а n - целое положительное число.
  • Предлагается разбить задачу на подзадачи, вычисляя сначала a в степени n-1 и затем умножая результат на a.

Рекурентная формула и оптимизация

1:26:43
  • Предлагается использовать рекурентную формулу для вычисления a в степени n-1, а затем умножить результат на a.
  • Обсуждается оптимизация алгоритма, разделяя и властвуя, то есть разбивая задачу на четные и нечетные случаи.

Реализация алгоритма на Python

1:38:48
  • Демонстрируется реализация алгоритма на Python, где используется рекурсия и разделение и властвование.
  • Проверяется результат работы алгоритма с помощью встроенного оператора возведения в степень в Python.

Обсуждение рекурсии

1:40:52
  • В видео обсуждается использование рекурсии в программировании, особенно в учебных и боевых задачах.
  • Рекурсия может быть заменена на более простые и эффективные методы, если это возможно.
  • Обсуждается важность разделения задач на более крупные и одинаковые части для оптимизации работы.

Рекурентные сортировки

1:41:46
  • В следующий раз планируется обсудить рекурентные сортировки, которые могут быть более эффективными и простыми в использовании.
  • Рекурсия - это мощный инструмент, который может быть использован в различных областях программирования.