Es un método de retroceso para imprimir permutaciones de cadena. No entiendo de qué manera se produce el flujo de control, como después de encontrar el intercambio, el intercambio se llama luego permutar y luego nuevamente. ¿Esto no se me viene a la cabeza?

Gracias por A2A
Aquí n = 3 y n-1 = 2
permute (str, 0,2) se invoca en main ().
1. Ahora l = 0 y r = 2 y si (l == r) es falso, el Control continúa con el ciclo ahora.
2. En for loop i = l = 0 ahora y se invoca swap (a [0], a [0]), que reemplaza A por A y no hace cambios en la cadena ABC.
2.1. Ahora permute (a, 1,2) se llama con permute, es decir, recursión.
1. if (l == r) donde l = 1 y r = 2 nuevamente falla y el control pasa a otra cosa
2. Aquí se invoca i = l = 1 y se invoca swap (a [1], a [1]), que reemplaza B por B y no realiza cambios en la cadena ABC.
3. Ahora se llama permute (a, 2,2) e imprime un ie ABC.
4. Ahora el control vuelve a 2.1.2 y ahora se invoca el segundo intercambio (a [1], a [1]), que reemplaza B por B y no realiza cambios en la cadena ABC.
5. i ++ en for hace que i = 2 mientras que l sigue siendo 1. Y swap (a [1], a [2]) hace ACB.
6. Ahora se llama permute (a, 2,2) e imprime un ie ACB.
7. Se llama el segundo intercambio (a [1], a [2]) que hace que ACB a ABC vuelva a estar.
8. i ++ hace que i = 3 y salimos del ciclo y permute (a, 1,2) está completo.
“El control vuelve al bucle del paso 2. donde i = l = 0 y se ejecuta el paso 2.1”.
2.2. Ahora se invoca el segundo intercambio (a [0], a [0]), que reemplaza A por A y no realiza cambios en la cadena ABC.
2.3. i ++ hace que i = 1 y l = 0 como en el paso 2., swap (a [0], a [1]) convierte ABC a BAC.
1. se invoca permute (a, 1,2) que actúa igual que 2.1 pero ahora a es BAC.
2. Entonces, siga el paso 2.1, BAC y BCA se imprimen.
3. Observe que, como 2.1, nuevamente recuperamos BAC debido a la segunda función de intercambio.
2.4 Se llama el segundo intercambio (a [0], a [1]), lo que hace que BAC vuelva a ABC.
2.5 i ++ hace que i = 2 y l = 0, swap (a [0], a [2]) hace ABC a CBA.
1. se invoca permute (a, 1,2) que actúa igual que 2.1 pero ahora a es CBA.
2. Entonces, siga el paso 2.1, se imprimen CBA y CAB.
3. Observe que, como 2.1, nuevamente recuperamos CBA debido a la segunda función de intercambio.
2.6 Se llama el segundo intercambio (a [0], a [2]), lo que hace que CBA vuelva a ABC.
3. i ++ hace que i = 3 y hemos terminado.
“Espero que haya ayudado”

Para comprender el flujo de control de este problema, primero debe comprender cómo funciona la recursividad. Entonces te sugiero que tomes un pequeño ejemplo y sigas el programa. Pase lo que pase en el programa, hágalo con su ejemplo en una hoja de papel. Esto se llama ejecución en seco, la mejor manera de entender cualquier algoritmo.

después de la primera llamada de permute (), tenemos l = 0, r = 2.
ejecutando for loop:
i = l = 0;
intercambio (a + l) con (a + i), es decir, a [0] con a [0] – ABC
entonces permute (a, l + 1, r), es decir, permute (a, 1,2) se llama
ejecutando for loop:
i = l = 1;
intercambio (a + l) con (a + i), es decir, a [1] con a [1] – ABC
entonces permute (a, l + 1, r), es decir, permute (a, 2,2) se llama
ahora en esta llamada permute () tenemos l == r condición. entonces imprimimos ABC
~ ahora, viene el papel de retroceder (esto funciona debido a los valores introducidos en la pila en la llamada de función anterior).
obtenemos l = 1, i = 1 (justo antes de imprimir ABC)
ahora se llamará a la segunda función de intercambio
swap ((a + l), (a + i)), es decir, swap (a [1], a [1]) – ABC
i = 2, l = 1;
Se llama al primer intercambio y cambia a ACB
se llama permute (a, 2,2) e imprimimos – ACB
y así.

Para comprender mejor cómo se llama a la función permute () y swap (), vea este o / p
https://ideone.com/aGEmEt

¿Ayuda esta representación visual?

Otras respuestas son bastante buenas. Te sugiero que hagas una prueba en seco en papel y lo obtendrás.
Además de esto, también puede aprender a generar permutación en orden lexicográfico.

More Interesting

¿Por qué puede verse la secuencia de Fibonacci como un algoritmo dinámico y por qué tiene un mal tiempo de ejecución?

Rendimiento del software: ¿los algoritmos de cálculo se ejecutarán más rápido cuando se implementen en Node.js en lugar de C?

¿Cómo funciona la recursividad en el árbol de búsqueda binaria en orden? ¿Cómo se pueden explicar las llamadas recursivas, sin resumirlas como llamadas de pila?

¿Hay alguna lista de problemas de árbol AVL similares a los problemas de árbol binario de Stanford?

¿Qué debo hacer después de aprender Python? ¿Programación competitiva o aprender Djanjo o aprender algoritmos y estructura de datos en Python?

¿Cómo se puede mejorar la velocidad de los algoritmos de reconocimiento facial?

¿Qué es el algoritmo Twofish?

¿Cuál se debe aprender primero, estructuras de datos o algoritmos?

¿Puedo obtener el algoritmo para un enfoque iterativo en una búsqueda binaria de doble pivote?

¿Cuál es la diferencia entre tener un buen algoritmo y no tener uno?

¿Cuál es la forma más efectiva de aprender algoritmos?

¿Es mejor representar aristas en un gráfico que sale de un vértice como miembros de una matriz dinámica o una lista vinculada?

Cómo implementar un verificador de plagio en Java

¿Cómo saben las computadoras cuándo comienza y termina una cadena binaria?

15 personas se sentarán en una fila de 15 sillas. ¿Cómo calculo cuántos planes de asientos se pueden hacer, donde dos planes de asientos se consideran iguales si dos planes comparten cuádruples adyacentes? o ¿Cómo puedo crear un algoritmo eficiente para encontrar límites inferiores para 15 o menos personas?