Esta función tiene que devolver una cadena invertida. Por ejemplo, “perro” -> “dios”. Funciona correctamente pero no entiendo la lógica y necesito una explicación.
function reverse (str) { if (str.length <= 1) return str; return reverse(str.slice(1)) + str[0] }El caso base de la función recursiva es la declaración if, donde cuando solo hay un carácter en la cadena, obtienes la cadena misma.
En la instrucción de retorno, la función de división proporciona la cadena sin el primer carácter. El + str[0] ayuda a invertir la cadena adjuntando la primera letra de la cadena al final de la cadena, mientras que la función inversa se llama recursivamente en la cadena sin el primer carácter.
Veamos el mundo TENET como ejemplo.
En la primera ejecución, no se llamará a la instrucción if. La declaración de devolución devolverá inversa (ENET) + T. Esto hará que se vuelva a llamar inversa con ENET como entrada.
En la segunda ejecución, la declaración if se omite nuevamente y la declaración return dará reverse(NET) + E.
Con suerte, puedes ver a dónde va esto. En cada llamada recursiva, el primer carácter se agrega al final de la cadena de entrada. Para cuando terminemos todas las llamadas, ¡la palabra se invertirá!
En primer lugar, llama a reverse(“dog”) y devuelve reverse(“og”)+”d” Luego, reverse(“og”) continúa ejecutándose nuevamente. Devuelve reverse(“g”)+”o” El último, reverse(“g”) solo devuelve “g” ya que la sentencia if es verdadera
Luego, conecta el reverso ("g") al reverso ("g") + "o", como resultado, se devuelve "go" Finalmente, conecta el reverso ("og") al reverso ("og") + "d ”, que es “ir”+”d”, como resultado “dios” es la salida
No es necesario que alguien escriba el comportamiento de recurrencia para un ejemplo, ya que es posible que no se aplique a todos los tipos y órdenes de recurrencia.
Lo mejor es ejecutar y depurar el fragmento proporcionado y observar el seguimiento de la pila local y los valores del ámbito, ya que necesita comprender lo que hace en cada llamada.
function reverse (str) { if (str.length <= 1) return str; debugger; const remainingString = str.slice(1); const leadingChar = str[0]; return reverse(remainingString) + leadingChar; } En este ejemplo es obligatorio entender solo que esto ejecutará primero el reverse(remainingString) hasta llegar a if (str.length <= 1) return str; , luego extraiga funciones de la pila de llamadas y agregue el valor devuelto con + leadingChar hasta que todas las funciones se extraigan de la pila de llamadas.