2 rekursive funktionen, die sich gegenseitig aufrufen



  • Hallo!

    ich hoffe mir kann jemand helfen!
    Und zwar habe ich zwei funktionen aus einer klasse, sx und sy.
    sy werden parameter übergeben, die sich beim nächsten aufruf um eins versetzen sollen. (also berechne_sx(x1,x2,y1,y2,sy)
    ->berechne_sx(x1+i,x1,y1+i,y1,sy)
    nun ist mein problem, dass ich zwar im ersten durchgang einen wert für sy übergebe. aber dann beim rekursiven aufruf sollte der wert, der in der funktion berechne_sy berechnet wird, übergeben werden.
    aber der ist zu dem zeitpunkt noch nicht berechnet.

    Hat jemand ne idee wie ich da sproblem lösen könnte?
    meine derzeitigen ideen sind:
    -beide funktionen zu einer machen ( gibt aber leider momentan noch das falsche aus)
    -statt sy zu übergeben, berechne_sy(..) übergeben( was bis jetzt auch noch nicht klappt, auch nciht wenn ich es vorher als double b=berechne_sy(...) und dann als b übergeb)

    ich würd mich sehr über hilfe freuen 🙂

    void Punkt::berechne_sigma_y( double y_2, double y_1, double x_2, double x_1, double s_yA,double s_yP, double s_xP, double s_xA)
    {
    	if(next->get_next()!=NULL)
        {  
    		sigma_y=sqrt(a1*s_yA+a2*s_yP+a3*s_xP+a4*s_xA+sin(t)*ss+w*standABr+w*standABr)
            next->next->berechne_sigma_y(y_1,get_y(),x_1,get_x(),get_sigmay(),s_yA,s_xA,get_sigmax();
        }
    }
    
    void Punkt::berechne_sigma_x(double y_2, double y_1, double x_2, double x_1, double s_yA,double s_yP, double s_xP, double s_xA)
    {
        if(next->get_next()!=NULL)
        {
    		sigma_x=sqrt(pow(get_b1(),2.)*pow(s_yA,2.)+pow(get_b2(),2.)*pow(s_xA,2.)+pow(get_b3(),2.)*pow(s_yP,2)+pow(get_b4(),2.)*pow(s_xP,2.)+pow(cos((get_t())/((4.*atan(1.0))/200.)),2.)*pow(ss,2.)+pow(get_v(),2.)*pow((standABr)/(200./(4.*atan(1.0))),2.)+pow(get_v(),2.)*pow((standABr)/(200./(4.*atan(1.0))),2.));
          //  sigma_y=sqrt(pow(get_a1(),2.)*pow(s_yA,2.)+pow(get_a2(),2.)*pow(s_yP,2.)+pow(get_a3(),2.)*pow(s_xP,2.)+pow(get_a4(),2.)*pow(s_xA,2.)+pow(sin((get_t())/((4.*atan(1.0))/200.)),2.)*pow(ss,2.)+pow(get_w(),2.)*pow((standABr)/(200./(4.*atan(1.0))),2.)+pow(get_w(),2.)*pow((standABr)/(200./(4.*atan(1.0))),2.));
    		next->next->berechne_sigma_x(y_1,get_y(),x_1,get_x(),get_sigmay(),s_yA,s_xA,get_sigmax());
        }
    }
    

    so ich hab jetzt mal die erste funktion vereinfacht dargestellt.
    Ich habe alle anderen attribute in einer liste abgespeichert, sodass ich die funktion in der main nur einmal in einer whileschleife aufrufen wollte und es mir gleich alle sigmas berechnet. Mit allen anderen parametern funktioniert das, nur eben nicht mit sigma 😞
    Punkt ist die Klasse der beidne Memberfunktionen



  • Bitte vereinfache dein Beispiel stark und zeige etwas mehr Code. Was ist beispielsweise Punkt und wieso hat es ein Attribut next?



  • gast999999 schrieb:

    Hallo!
    [...]dass ich zwar im ersten durchgang einen wert für sy übergebe,
    aber dann beim rekursiven aufruf sollte der wert,
    der in der funktion berechne_sy berechnet wird, übergeben werden.
    aber der ist zu dem zeitpunkt noch nicht berechnet.

    ?? ist denn

    this->sigma_y != this->get_sigmay()
    


  • ich weiß nicht ob das so viel weiterhilft, aber so ist der aufruf in der main?
    ich weiß, ist ziemlich umständlich programmiert

    durchlaufZeiger=start;
        start->berechne_sigma_y(yP,yA,xP,xA,syA,syP,sxP,sxA);
        double sigmay_neu;
        double hh=1;
        dat<<"Standardabweichung der Neupunkte:"<<endl;
    
        while (durchlaufZeiger->get_next()->get_next()!=NULL)
        {
            sigmay_neu=durchlaufZeiger->get_sigmay();
    
            dat<<"sigma_y"<<hh++<<": "<<durchlaufZeiger->get_sigmay()<<endl;
            durchlaufZeiger=durchlaufZeiger->get_next();
            durchlaufZeiger=durchlaufZeiger->get_next();
    
        }
    
        dat<<endl;
        durchlaufZeiger=start;
        start->berechne_sigma_x(yP,yA,xP,xA,syA,syP,sxP,sxA);
        double sigmax_neu;
        double aa=1;
        while (durchlaufZeiger->get_next()->get_next()!=NULL)
        {
            sigmax_neu=durchlaufZeiger->get_sigmax();
    
            dat<<"sigma_x"<<aa++<<": "<<durchlaufZeiger->get_sigmax()<<endl;
            durchlaufZeiger=durchlaufZeiger->get_next();
            durchlaufZeiger=durchlaufZeiger->get_next();
    
        }
    

    @zeusoc:
    ich speichere das ergebniss sigma_y in get_sigmay



  • zeusosc schrieb:

    gast999999 schrieb:

    Hallo!
    [...]dass ich zwar im ersten durchgang einen wert für sy übergebe,
    aber dann beim rekursiven aufruf sollte der wert,
    der in der funktion berechne_sy berechnet wird, übergeben werden.
    aber der ist zu dem zeitpunkt noch nicht berechnet.

    ?? ist denn

    this->sigma_y != this->get_sigmay()
    

    also wenn

    this->sigma_y == this->get_sigmay()
    

    dann ist doch zum "zeitpunkt" des rekursiven aufrufes sy schon berechnet!

    beschreibe mal die berechnung deines sigmas mathematisch und gebe mal an
    wie du dein Werte Array aufbaust!

    grüße


Anmelden zum Antworten