Imprime todas las permutaciones de una cadena en C

Estoy aprendiendo retroceso y recursión y estoy atascado en un algoritmo para imprimir todas las permutaciones de una cadena. Lo resolví usando elalgoritmo de campana para la permutación, pero no puedo entender el método de recursión. Busqué en la web y encontré este código:

void permute(char *a, int i, int n) 
{
   int j; 
   if (i == n)
     printf("%s\n", a);
   else
   {
        for (j = i; j <= n; j++)
       {
          swap((a+i), (a+j));
          permute(a, i+1, n);
          swap((a+i), (a+j)); 
       }
   }
} 

¿Cómo funciona básicamente este algoritmo que no puedo entender? Incluso he intentado correr en seco!

¿Cómo se aplica el retroceso?

¿Y es más eficiente que el algoritmo de Bell para el cálculo de la permutación?

Respuestas a la pregunta(9)

Su respuesta a la pregunta