Stackoverflow-Abbruchbedingung

Status
Nicht offen für weitere Antworten.

java-anfaenger

Aktives Mitglied
Java:
public class Test_rek
{
    public double test(double epsilon){
        return 2*test(1,epsilon);
    }
    private static double test(int i, double epsilon){
    
    double b = 1.0 + 1.0/(4*i*i-1);
    
    if(b<epsilon){
        return 0;
    }
        return test(i+1,epsilon);
   
    }
}

wenn ich epsilon: 1.1 einsetze bricht er zwar ab, aber er liefert mir 0.0 zurück

wenn ich einen Wert unter 1.0 angebe dann: Stackoverflow Exception

Wie setze ich die Abbruch Bedingung bzw. den Basisfall richtig?
 
die Methode kann doch nur 0 zurückgeben oder eine Endlosschleife herbeiführen,
dann alle anderen returns außer der Rekursion liefern 0 zurück

die Frage läßt sich ohne Kenntnis deiner Ziele nicht beantworten,
natürlich kann man irgendwo
return b;
hinschreiben, das wäre wohl was anderes als 0
 
hi, danke für die Antwort

wenn b< epsilon ist, dann möchte ich das return 2*test(1,epsilon) zurückgegeben wird
wenn ich b<1 eingebe rechnet er mir pi richtig näherungsweise, bis die stackoverflow Meldung kommt...
 
Ich versteh zwar nicht, was du mit dem Code vorhast... aber dass ein epsilon <= 1.0 einen Stackoverflow Error gibt ist offensichtlich: Du berechnest b als 1 plus etwas positives. b ist also in jedem Fall größer as 1. Mit einem zu kleinen epsilon greift deine Abbruchbedingung also nie.
 
hi, danke für die Antwort

wenn b< epsilon ist, dann möchte ich das return 2*test(1,epsilon) zurückgegeben wird
wenn ich b<1 eingebe rechnet er mir pi richtig näherungsweise, bis die stackoverflow Meldung kommt...

Naja, die Methode will sich unendlich oft wieder aufrufen, irgendwann ist halt kein Platz mehr sich zu merken wieoft die Methode schon aufgerufen wurde...

Da double nur begrenzt ist müsstest du überprüfen ob der neu errechnete double-werte überhaupt anders ist als der alte...

edit:
nochmal dein problem:

Du rufst die Methode auf.
erste Möglichkeit: b<epsilon, rufe die Methode mit anderem Parameter auf.
zweite Möglichkeit: gib 0 zurück.

Eine ordentliche Zahl wird da nicht rauskommen können.
 
Zuletzt bearbeitet:
> wenn b< epsilon ist, dann möchte ich das return 2*test(1,epsilon) zurückgegeben wird

das *2 passiert am Ende, hat mir der Rekursion nix zu zun

> wenn ich b<1 eingebe rechnet er mir pi richtig näherungsweise, bis die stackoverflow Meldung kommt...

rechne nur den Term 1.0/(4*i*i-1) aus, wenn der kleiner epsilon ist (epsilon = 0.00..1) dann fertig,
allerdings musst du alle bisher berechneten Terme addieren, so wie es in der Formel steht

fange besser erstmal mit was einfachem an wie die Summe von 1 bis n oder n! rekursiv
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben