![]() |
Problema con una funcion recursiva -- JDK 6.0 Hola a tod@s y gracias por tomarse el tiempo de leer estoy diseñando un pequeño programa que grafique la curva de koch de manera recursiva pero me encontré con un problema al compilar eclipse me vota el siguiente error: Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError consulte en la pagina de sun acerca de este bug y dice que es generado por una recursion infinita, pero no he podido hallar la forma en que esa recursion infinita se da.. anexo el codigo para que por fvor me ayuden.. la funcion esta en la clase Koch y se llama kochRecursivo(double, int).. el objeto de tipo Cursor funciona bien, ya que cuando kochRecursivo recibe como parametro entero un 0, el dibuja la linea que quiero que dibuje... cuando quiero que utilice la recursion... FALLA!!! ************************ import java.awt.*; import javax.swing.*; public class Cursor { private double x;//refiere a la coordenada en x a graficar private double y;//refiere a la coordenada en y a graficar private double angulo;//refiere al angulo de giro representado en gradianes private Color color; //modifica el color de la grafica private Graphics g;// objeto que permite graficar public Cursor () { x=0.0;//inicializacion de las variables en valores válidos y=0.0; angulo=0.0; this.color=Color.black; } public void definirInicio(double x,double y,double angulo,Graphics g) { //situa el cursor en el origen del plano y brinda la interfaz para graficar this.x=x; this.y=y; this.angulo=angulo*Math.PI/180; this.g=g; } public void CambiarColor(Color color) { //funcion que perimiote cambiar el color de la grafica this.color=color; } public void Girar(double angulo) { //cambia el angulo del cursor //recibe grados hexagecimales y los convierte a radianes this.angulo=angulo*Math.PI/180; } public void nuevaPosicion(double x, double y) { //coloca el cursor al final de un trazo this.x=x; this.y=y; } public void trazar(double distancia) { //dibuja una linea de un color especifico //desde la coordenada inicial (x,y) hasta una nueva coordenada //(coorx,coordy) definida segun la longitud del trazo double coordx = x + (distancia*Math.cos(angulo));//distancia convertida a abcisa (como si fueran polares) double coordy = y + (distancia*Math.sin(angulo));//distancia convertida a ordenada (como si fueran polares) g.setColor(color);//cambio del color g.drawLine((int)coordx,(int)coordy,(int)x,(int)y);//trazo de la linea nuevaPosicion(coordx,coordy);//coloca el cursor al final del trazo } public void putPixel (double x, double y) { g.setColor(color); g.drawLine((int)x,(int)y,(int)x,(int)y); } } ************************************************ import java.awt.*; import javax.swing.*; public class Koch extends JFrame { Cursor tortuga; public Koch() { tortuga = new Cursor(); setSize(500,500); setVisible(true); } public void paint (Graphics g) { super.paint(g); tortuga.definirInicio(50,250,0,g); kochRecursivo(300.0,1); } public void kochRecursivo(double distancia,int nivel) { if(nivel==0) { tortuga.trazar(distancia); } else { kochRecursivo(distancia/3,nivel--); tortuga.Girar(60); kochRecursivo(distancia/3,nivel--); tortuga.Girar(-120); kochRecursivo(distancia/3,nivel--); tortuga.Girar(60); kochRecursivo(distancia/3,nivel--); } } public static void main (String [] args) { Koch aplicacion = new Koch(); aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON _CLOSE); } } *********************************************** |
Re: Problema con una funcion recursiva -- JDK 6.0 El problema es que estas dejando llamadas recursivas pendientes y toda sentencia que quede despues de un llamado recursivo se va a ejecutar y en la condicion de corte pregunta si es igual a cero eso hace que cuando sea negativo siga llamando y como lo que haces es restar a un numero positivo en algun momento se hace cero pero despues menos uno, menos dos etc y a si sucesivamente yo cambiaria el if(nivel==0) por un if(nivel>=0) para que corte al llegar a cero o a un negativo Saludos espero que te lo solucione. |
| La zona horaria es GMT -6. Ahora son las 09:24. |
Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.