Мне нужно доказать правильность алгоритма Кучи для генерации перестановок. Псевдокод для него следующим образом:Алгоритм доказывания кучи для генерации перестановок
HeapPermute(n)
//Implements Heap’s algorithm for generating permutations
//Input: A positive integer n and a global array A[1..n]
//Output: All permutations of elements of A
if n = 1
write A
else
for i ←1 to n do
HeapPermute(n − 1)
if n is odd
swap A[1] and A[n]
else swap A[i] and A[n]
(взят из Введения в разработку и анализ алгоритмов Левитина)
Я знаю, что нужно использовать индукцию, чтобы доказать свою правоту, но я не точно, как это сделать. Я доказал математические уравнения, но не алгоритмы.
Я думал, доказательство будет выглядеть примерно так ...
1) For n = 1, heapPermute is obviously correct. {1} is printed.
2) Assume heapPermute() outputs a set of n! permutations for a given n. Then
??
Я просто не знаю, как идти о завершении шага индукции. Я даже на правильном пути здесь? Любая помощь будет принята с благодарностью.
Эта статья из 1977 содержит хорошее доказательство: http://homepage.math.uiowa.edu/~goodman/22m150.dir/2007/Permutation%20Generation%20Methods.pdf –