Комдинаторика за програмисти - Б
4. ако i 1), или цикъл [1 2. ... ... m] ако m е четно.
Доказателството се извършва чрез индукция на m, както обикновено се прави при доказване на коректността на рекурсивните алгоритми. Лесно е да се провери директно, че условията W 1 и W 2 са изпълнени. Да предположим, че m ≥ 3. Нека докажем удовлетворяемостта на W m, като приемем истинността на W m - 1. Разделяме доказателството на две части в зависимост от това дали m е четно или нечетно.
Случай 1, m е нечетен. По силата на индуктивното предположение, изпълнението на P ERM (m - 1) в ред 14 води всеки път до промяна в стойностите на P [1],. ... ..., P [m - 1] по време на цикъла [1 2. ... ... m - 1]. Така че транспонирането P [m]: =: P [m - 1] в ред 15 избира различни елементи в P [m] всеки път. Ако в началото P [i] = a i, 1 ≤ i ≤ m, тогава елементите a m, a m− 2 се поставят в P [m] на свой ред,
1.4. Генериране на пермутации
Брой изпълнени итерации на цикъла 13
a m - 3 a m - 3 a m - 3
a m - 4 a m - 4 a m - 4 a m - 4
a m− 2 a m− 1 a m− 2
a m− 1 a m− 3 a m− 2 a m− 3
a m− 1 a m− 2 a m− 1
a m− 2 a m− 1 a m− 3 a m− 2
a m− 3 a m− 2 a m− 1 a m− 1
Таблица 1.1: Промяна на стойностите на променливи P [1],. ... ..., P [m] по време на изпълнение на процедурата P ERM (m) за четен m