Está en la página 1de 3

Estoy tratando de hacer una practica de recursividad en java y me da esa exception.

Este es el main:

public class ​Recursividad1​ { public static void main(​String​[] args) {


System​.out.println("El factorial es: "+​NumeroEntero​.getFactorial(5));
System​.out.println("El factorial es: "+​NumeroEntero​.getPotencia(5, 2)); } }

y esta es la clase donde están los métodos recursivos:

public class ​NumeroEntero​ { private static int devuelveFactorial(int numero)


{ if (numero == 0) { return 1; } else { return numero *
devuelveFactorial(numero--); } } private static int devuelvePotencia(int
valor, int potencia) { if (potencia == 0) { return 1; } else { return valor *
devuelvePotencia(valor,potencia--); } } public static int getPotencia(int
valor2, int potencia2){ return devuelvePotencia(valor2, potencia2); } public
static int getFactorial(int numero2){ return devuelveFactorial(numero2); } }

java​ ​poo​ ​recursión

compartir​mejorar esta pregunta​seguir


formulada el 9 sep. 18 a las 22:38

vmporcayom
127​1
1 medalla de plata
13
13 medallas de bronce
añade un comentario

1 respuesta
Activo​Más antiguo​Votos
6
¿Qué es el stack?

El stack en java es una pila en la que se almacenan los datos referentes a la ejecución
de los métodos (variables internas, y demás).

¿Qué es el StackOverflow?
Cada vez que haces una llamada a un método, se reserva memoria en el stack.
Teniendo en cuenta que la memoria es finita, siempre existe la posibilidad de que esa
memoria se acabe llenando.

Cuando esa memoria se llena y haces una llamada más a otro método nuevo, la JRE no
es capaz de guardar los datos necesarios en memoria porque está llena, y entonces es
cuando se lanza el StackOverflow.

¿Por qué se da en llamadas recursivas?

Del punto anterior te habrás dado cuenta de que, en teoría, es bastante fácil forzar un
StackOverflow. La parte buena es que en java, hay un montón de optimizaciones, tanto
del recolector de basura como por parte del compilador para evitar cosas así.

Un punto en el que no se puede evitar, sin embargo, es en las llamadas recursivas:

Cuando llamas a un método desde otro en java, se guarda la memoria del método inicial
y el recolector de basura no puede limpiarlo.

Esto normalmente no es problema porque no suele haber una cola de llamadas muy
larga entre métodos, pero en una llamada recursiva infinita, el stack se llena
rápidamente.

Por eso es muy importante dejar un retorno que se acerque cada vez más al caso trivial,
que en tu ejercicio es ​numero == 0​.

¿Cuál es tu error?

Tu error se da en esta línea:

return numero * devuelveFactorial(numero--);

No es fácil de cazar a simple vista. El problema es que al hacer ​numero--​ estás


aplicando un ​post-decremento​. Es decir, java va a ejecutar primero el retorno, ​y
después de devolver el resultado, decrementar el valor de ​numero​, pero ya es
demasiado tarde​.

Arreglarlo es tan fácil como cambiar el post-decremento por un ​numero - 1​:


return numero * devuelveFactorial(numero - 1);

También podría gustarte