Resulta que tengo una función recursiva que a veces falla y a veces no. No lo he medido pero más o menos al anidarse más de 100 veces falla.
Simplificándolo mucho, tengo una matriz de una imagen y la recorro recursivamente para agrupar los píxeles por zonas. Pero cuando la imagen tiene zonas grandes me da la excepción
Cita:
Lo gracioso es que el código lo tenía escrito en C y funcionaba perfectamente pero lo al portarlo a Java me he encontrado esta sorpresa.protected boolean agrupar(int x, int y, int grupo){ // coordenadas X e Y y grupo que se le quiere asignar
if(matriz[x][y].grupo!=null){
return false; // si ya tiene un grupo asignado... no hacemos nada
}
else{
matriz[x][y].grupo=grupo; // si no tiene grupo, se lo asignamos
agrupar(x, y-1, grupo); // y repetimos recursivamente: vecino debajo
agrupar(x, y+1, grupo); // repetimos recursivamente: vecino arriba
agrupar(x-1, y, grupo); // repetimos recursivamente: vecino izquierdo
agrupar(x, y-1, grupo); // repetimos recursivamente: vecino derecho
return true;
}
if(matriz[x][y].grupo!=null){
return false; // si ya tiene un grupo asignado... no hacemos nada
}
else{
matriz[x][y].grupo=grupo; // si no tiene grupo, se lo asignamos
agrupar(x, y-1, grupo); // y repetimos recursivamente: vecino debajo
agrupar(x, y+1, grupo); // repetimos recursivamente: vecino arriba
agrupar(x-1, y, grupo); // repetimos recursivamente: vecino izquierdo
agrupar(x, y-1, grupo); // repetimos recursivamente: vecino derecho
return true;
}
Estoy seguro de que no entra en bucle infinito, lo que pasa es que según con qué imágenes, se pueden anidar cientos de llamadas recursivas ¿hay alguna solución a esta limitación del StackOverflow?
Os voy a poner un ejemplo. Con esta imagen:
[url=http://www.subirimagenes.com/otros-exi-4400498.html]Ver Imagen: http://s3.subirimagenes.com:81/otros/previo/thump_4400498exi.jpg[/url]
si llamo a agrupar() empezando por un pixel del círculo azul, eso empieza a llamarse recursivamente decenas de veces hasta agrupar todos los píxeles del círculo azul, y termina sin problema. Pero si lo hago con la mancha naranja se hacen muchas más llamadas recursivas anidadas (lógico porque es más grande, hay más píxeles) y en mitad del proceso me da "Exception in thread "main" java.lang.StackOverflowError" cosa que en C no me pasaba (aguantaba miles de llamadas recursivas)