2 Algoritmo ricorsivo per generare permutazioni
L’uso di un algoritmo ricorsivo per la generazione di permutazioni non `e particolarmen-te conveniente perche non permette di generare una permutazione per volta, e inoltrel’approccio iterativo `e di pers`e pi`u veloce perche non usa memoria di stack, detto questoho deciso di includere comunque questo algoritmo come esempio “didattico”.L’implementazione ricorsiva `e una tipica applicazione dell’approccio
divide et impera Le permutazioni di un vettore di n elementi si ottengono calcolando le permutazioni del sottovettore di n-1 elementi e poi scambiando l’n-esimo elemento con ogni elemen-to del sottovettore. Il caso base `e la permutazione di un vettore di due elementi che `esemplicemente uno scambio
Listing 2: Algoritmo ricorsivo
static void
permuta ricorsivo (
int
[ ] elementi ,
int
da ,
int
a)
{
int
k;
if
(a
>
da)
{
for
(k = a; k
>
= da; k
−−
)
{
Array util .swap( elementi , k, a );permuta ricorsivo ( elementi , da , a
−
1);Array util .swap( elementi , k, a );
}}
else
{
System . out . println ( Array util .dump( elementi ));
}}
2,1,3,4 2,1,4,3 4,1,3,2 2,4,3,11,3,2,4 1,4,2,3 1,3,4,2 4,3,2,13,1,2,4 4,1,2,3 3,1,4,2 3,4,2,13,2,1,4 4,2,1,3 3,4,1,2 3,2,4,12,3,1,4 2,4,1,3 4,3,1,2 2,3,4,1Tabella 1: Esecuzione dell’algoritmo su un vettore di 4 elementi3