Найти в Дзене
Old Programmer

Рекурсия в программировании (язык C). Статья 7 (генерация сочетаний)

Оглавление

Все ссылки на статьи и ролики моего канала Old Programmer расположенные по темам: Программирование. Тематическое оглавление моего Zen-канала (Old Programmer). А здесь все мои ресурсы по рекурсивному программированию.

В моём новом канале, посвящённом программированию на Python есть статья, посвященную алгоритму генерации сочетаний

и целый раздел, посвящённый комбинаторике

Python, комбинаторные алгоритмы | programmer's notes (python and more) | Дзен

Что такое сочетание в математике

Сегодня снова моя любимая тема: рекурсивное программирование. Рассмотрим генерацию количества сочетаний из n по k. Количество сочетаний вычисляется по следующий формуле (см. Рисунок 1). Оно отличается от числа размещений тем, что внутри подмножества генераций перестановок не происходит. Т.е. подмножества (сочетание по 3) 1 2 3 и 2 3 1 считаются тождественными.

Рисунок 1. Количество сочетаний из n  по k
Рисунок 1. Количество сочетаний из n по k

Как генерировать сочетания программно

Теперь вспомним нашу статью о генерации размещений. Убедимся, что количество сочетаний меньше количества размещений в k! раз. Это и понятно, ведь мы не учитываем перестановки внутри подмножества. Это наталкивает на мысль, что можно взять программу main60.c из статьи и просто ее доработать. Собственно это я и сделал. Программы в сущности отличаются только циклами внутри рекурсивной функции (см. main60.c и main125.c). Заголовок

for(int i=h+1; i<n; i++)

как раз и обеспечивает нас тем, что перестановки внутри подмножества не генерируются. Сравним с

for(int i=0; i<n; i++)

из main60.c (статья о генерации размещений)

Пример.

На входе:

1 2 3 4
3

На выходе:

1 2 3
1 2 4
1 3 4
2 3 4
4

Пока все о рекурсии, до следующих встреч. Подписываемся на мой канал Old Programmer.

Я вижу, что вы забыли поставить ЛАЙК, не так ли?

Фрагмент программы main125.c
Фрагмент программы main125.c

Рекомендуем почитать