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”
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?
Related Content
Cómo preparar estructuras de datos y algoritmos desde cero
Cómo usar el algoritmo de dijkstra en programación competitiva
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
¿Hay alguna lista de problemas de árbol AVL similares a los problemas de árbol binario de Stanford?
¿Cómo se puede mejorar la velocidad de los algoritmos de reconocimiento facial?
¿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?
Cómo implementar un verificador de plagio en Java
¿Cómo saben las computadoras cuándo comienza y termina una cadena binaria?