function permToN(charList, returnLen, base) { if (base.length === returnLen) { console.log(base) } else { for (let char of charList) { base += char permToN(charList, returnLen, base) } } } permToN(['a', 'b', 'c'], 2, "");Hola, estaba repasando algunos algoritmos y esto me desconcertó. En el código anterior, el problema falla y se excedió el tamaño máximo de la pila de llamadas.
Sin embargo, si elimino la línea base += char y realizo la llamada de función recursiva en su lugar con permToN(charList, returnLen, base + char) concatenando la cadena dentro del parámetro de función, la función funciona según lo previsto, sin desbordamiento de pila , estoy bastante desconcertado por qué ese pequeño cambio provoca el desbordamiento de la pila. Creo que no puedo entender cómo funciona la memoria debajo del capó. Agradecería enormemente a cualquiera que pueda explicar la diferencia en el rendimiento entre las funciones. A continuación se muestra la función con la concatenación que se produce en los parámetros de la llamada de función que funciona según lo previsto. La función anterior provoca un desbordamiento de pila. No entiendo la diferencia fundamental aquí. ¡gracias!
function permToN(charList, returnLen, base) { if (base.length === returnLen) { console.log(base) } else { for (let char of charList) { permToN(charList, returnLen, base + char) } } }