StackOverflowError erst ab 87 Array Elementen

Hero

Mitglied
Hallo,
ich bekomme ab 87 Array Elementen einen StackOverflowError. Das merkwürdige ist, dass es vorher läuft aber ab 87 nicht mehr. verwiesen wird auf einer Rekursion Methode auf den Rekursiven Funktion Aufruf.

Das Array wird benutzt um die Häufigkeit der Rekursiven-Methode zu definieren also
Java:
if(i<array.length)

und mit den Array Elementen wird gerechnet aber der Inhalt von Array wird nicht verändert.
Was ich noch sagen sollte ist, dass ich die Array Elemente über (Math.random()*20) definiere.

Im Prinzip funktioniert mein Algorithmus aber wie gesagt, ab 87

Java:
public static Circle2D kreisPaar(Point2D mittelpunkt, Point2D[] pnts, int i, int j, double radius){ // Durch diese Rekursion-Methode sparen wir 2 for-Schleifen
		double temp=0;	 Point2D mptmp = null;
		
		if(i<pnts.length){
			if(j<pnts.length){
				temp=(Math.sqrt((pnts[j].x-pnts[i].x)*(pnts[j].x-pnts[i].x))+((pnts[j].y-pnts[i].y)*(pnts[j].y-pnts[i].y))) /2;
				mptmp=new Point2D((pnts[i].x+pnts[j].x)/2,(pnts[i].y+pnts[j].y)/2);
				//System.out.println(i+"             "+j+"      "+temp+ ":::::::::::" +mptmp);
				j++;
				
				if(radius<temp){
					radius=temp;
					mittelpunkt=mptmp;
					
				}
			}
		}
		
		if(j==(pnts.length)){ //Wenn j das letzte Element im Array erreicht hat, dann...
			i++; // soll i um 1 Zähler hochgezählt werden
			j=i+1; //und j wieder auf i+1 gesetzt werden
		}
		
		if(i!=(pnts.length)){ //Wenn i das letzte Element im Array noch nicht erreicht hat, dann...
			return kreisPaar(mittelpunkt,pnts,i,j, radius); //Springe in die Methode, nach oben zurück
		}
		
		
		Circle2D kreis=new Circle2D(mittelpunkt,radius); // dann sind alle Punkte miteinander vergleichen und 
		return kreis; //können zurück gegeben werden
	}
 
Zuletzt bearbeitet:
Sorry hab vergessen, den Code reinzu kopieren

Java:
public static Circle2D kreisPaar(Point2D mittelpunkt, Point2D[] pnts, int i, int j, double radius){ // Durch diese Rekursion-Methode sparen wir 2 for-Schleifen
		double temp=0;	 Point2D mptmp = null;
		
		if(i<pnts.length){
			if(j<pnts.length){
				temp=(Math.sqrt((pnts[j].x-pnts[i].x)*(pnts[j].x-pnts[i].x))+((pnts[j].y-pnts[i].y)*(pnts[j].y-pnts[i].y))) /2;
				mptmp=new Point2D((pnts[i].x+pnts[j].x)/2,(pnts[i].y+pnts[j].y)/2);
				//System.out.println(i+"             "+j+"      "+temp+ ":::::::::::" +mptmp);
				j++;
				
				if(radius<temp){
					radius=temp;
					mittelpunkt=mptmp;
					
				}
			}
		}
		
		if(j==(pnts.length)){ //Wenn j das letzte Element im Array erreicht hat, dann...
			i++; // soll i um 1 Zähler hochgezählt werden
			j=i+1; //und j wieder auf i+1 gesetzt werden
		}
		
		if(i!=(pnts.length)){ //Wenn i das letzte Element im Array noch nicht erreicht hat, dann...
			return kreisPaar(mittelpunkt,pnts,i,j, radius); //Springe in die Methode, nach oben zurück
		}
		
		
		Circle2D kreis=new Circle2D(mittelpunkt,radius); // dann sind alle Punkte miteinander vergleichen und 
		return kreis; //können zurück gegeben werden
	}
 
Durch diese Rekursion-Methode sparen wir 2 for-Schleifen

Das "Sparen" geht in diesem Fall eindeutig zu Lasten der Lesbarkeit. Manche Sachen lassen sich besser rekursiv formulieren, manche besser iterativ - wie diese. Und bei Iterationen wirst du jedenfalls keinen Stackoverflow bekommen.

87 Punkte erscheinen mir trotzdem ziemlich wenig für einen Stackoverflow zu sein.

Wenn ich das richtig sehe, willst du den kleinsten Kreis finden, der alle gegebenen Punkte umschließt. Dafür gibt es aber sicher bessere Algorithmen. Z.B. könntest du in jedem Schritt alle Punkte, die im aktuellen Kreis liegen (was sich einfach prüfen lässt), aus deiner Punkte-Liste rausschmeißen.
 
Zuletzt bearbeitet:

Zurück
Oben