Шаг 124.
Рекурсия на Python.
Задачи подсчёта. Сочетания

    На этом шаге мы рассмотрим особенности рекурсивного вычисления сочетаний.

    Сочетание из n различных элементов по k без повторений - это просто подмножество из k элементов исходного множества. Сочетания подобны размещениям, только порядок следования элементов здесь не имеет значения. Поэтому сочетание соответствует (под)множеству, а не последовательности. Например, подмножество 1, а2, а3} - это сочетание элементов на множестве 1, а2, ..., а10}, причём 1, а2, а3} и 3, а1, а2} не различаются. На этом шаге мы займёмся подсчётом всех сочетаний из n различных элементов по k элементов без повторений.

    Размер этой задачи зависит и от k, и от n (где k < n). Как мы вскоре увидим, для разработки рекурсивного решения их необходимо уменьшать вместе. Но мы начнём с определения начальных условий. Тривиальное выполняется при k = n, когда существует лишь одно правильное сочетание - это всё множество из n элементов. Другое простое условие выполняется при k = 1, когда результат, очевидно, равен n. Кроме того, при k = 0 можно считать, что есть только одна правильная комбинация - пустое множество. Как и в предыдущих шагах, если у нас есть начальное условие для k = 0, то необходимость в начальном условии для k = 1 отпадает.

    Для вывода рекурсивного условия разобьём все сочетания на два множества. Рассмотрим исходное множество из n элементов 1, а2, ..., аn} и отдельный его элемент, скажем, а1. Обратите внимание, что существует два типа сочетаний:

Таким образом, исходную задачу f(n, к) можно разбить на две в зависимости от типа сочетания, как показано на рисунке 1.


Рис.1. Декомпозиция задачи подсчёта сочетаний из n элементов по k

    Если сочетания содержат а1, то оставшиеся k - 1 элементов - это сочетания из n - 1 элементов подмножества 2, ..., аn} по k - 1 элементов. А этот набор сочетаний определяется функцией f(n - 1, k - 1). Если же а1 не содержится в сочетаниях, то это - сочетания из того же подмножества 2, ..., аn} по k элементов, а количество таких сочетаний - f(n - 1, k). Таким образом, результатом будет сумма обоих типов сочетаний, а рекурсивная формула - f(n, k) = f(n - 1, k - 1) + f(n - 1, k). В итоге вместе с начальными условиями функция определяется как

              1,                             если k = 0 или k = n,
    f(n, k) =                                            
              f(n - 1, k - 1) + f(n - 1, k), в противном случае, 
и определяет биномиальный коэффициент (см. (3.2)).

    На следующем шаге мы рассмотрим подъём по лестнице.




Предыдущий шаг Содержание Следующий шаг