Rekursive Berechnung von n über k schlägt fehl

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich versuche die Berechnung n über k mit Hilfe von Rekursiion zu berechnen.
Die Fakultät wird richtig ausgerechnet, dass habe ich alles schon getestet.
Nur wenn ich dann den n über k berechnen möchte, erhalte ich die unten stehende Fehlermeldung.

Wieso kommt die und wie kann ich die beheben?


Danke

Gruß

Alaska


Code:
private double fakultaet(int n){
	      if (n==0||n==1) return 1;
	      else return n*fakultaet(n-1);
	   }
	
	
	public double berechnungNueberKrekursiv(int n) {
		double ergebnis = 0;
		ergebnis = this.fakultaet(n)
				/ (this.fakultaet(this.k) * this.fakultaet(n - this.k));
		return ergebnis;
	}


Folgende Fehlermeldung erhalte ich.

Exception in thread "main" java.lang.StackOverflowError
at NUeberK.fakultaet(NUeberK.java:25)
at NUeberK.fakultaet(NUeberK.java:25)
at NUeberK.fakultaet(NUeberK.java:25)
at NUeberK.fakultaet(NUeberK.java:25)


Und das dann sehr oft, woran liegt es?
 
Bei jedem Methodenaufruf wird die Rücksprungadresse und der Zustand der lokalen Variablen auf einen Stack gelegt.
Bei der Rückkehr aus der Methode wird der Zustand der Variablen der aufrufenden Methode aus dem Stack gepoppt.
Geht die Rekursion sehr tief wird der Stack größer und größer bis der für der Stack reservierte Speicher überläuft, was sich in einer StackOverflowException bemerkbar macht.
 
Wildcard hat gesagt.:
Bei jedem Methodenaufruf wird die Rücksprungadresse und der Zustand der lokalen Variablen auf einen Stack gelegt.
Bei der Rückkehr aus der Methode wird der Zustand der Variablen der aufrufenden Methode aus dem Stack gepoppt.
Geht die Rekursion sehr tief wird der Stack größer und größer bis der für der Stack reservierte Speicher überläuft, was sich in einer StackOverflowException bemerkbar macht.

Und was kann ich jetzt dagegen tun?
Wie muss ich das umschreiben??
 
Es gibt 2 Möglichkeiten:
1.
Deine Rekursion findet kein Ende weil sie falsch implementiert ist -> fehler korrigieren und beheben

2.
Deine Rekursion wird sehr tief weil du mit großen Werten arbeitest und tatsächlich so viele Schritte nötig sind.

Grundsätzlich ist der Zahlenbereich der sich mit Rekursion berechnen lässt begrenzt, da sehr viel Speicher benötigt wird.
Also entweder iterativ lösen, oder mehr Stack-Speicher reservieren.
zB mit java -Xss4096k starten
(4096kb Stack pro Thread)
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben