Rekursionen



  • Hey,
    Ich würde mal gerne wissen wie man ein rekursives Programm in eines mit Schleifen
    schreibt, dabei würde ich gerne eine for, while-schleife kopf/fußgesteuert verwenden.
    Hier ist ein Programm, das nach dem Newtonverfahren der Quadratwurzel Annäherung basiert.

    #include <iostream>
    using namespace std;

    double Betrag(double x) {
    return ((x<0) ? -x : x);}

    bool gut_genug (double x, double a) {
    return (Betrag(x*x-a) <= 1e-15); }

    double wurzeliter (int i, double xn, double a) {
    if (gut_genug(xn,a)||(i>1000)) return xn;

    cout << "i= " << i << ", x= " << xn << endl;
    wurzeliter(i+1,(xn+a/xn)*0.5,a);
    return 0; }

    double wurzel (double a) { return wurzeliter(1,1.0,a); }

    int main () {
    cout.precision(20); cout << wurzel(2) << endl;
    return 0;}



  • Rat mal wieso es code-tags gibt.
    Ach was, ich beantworte dir das einfach mal so - damit es lesbar wird.


  • Mod

    Willst du eine allgemeine Vorgehensweise oder nur fuer diesen Fall? In diesem Fall ist es doch einfach, eine Rekursion

    void foo(argumente)
    {
      if (bedingung)
      {
         code;
         foo(aenderung(argumente));
      }
    }
    

    ist doch nichts anderes als eine Schleife

    argumente;
    solange(bedingung)
    {
      code;
      aendere(argumente);
    }
    

    Das in die konkreten verschiedenen Schleifenformen zu uebersetzen ueberlasse ich mal dem Leser zur Uebung, da es offensichtlich eine Hausaufgabe ist.

    Wenn die Rekursion sich verzweigt, wird das Kochrezept natuerlich deutlich komplizierter, aber dieser Fall liegt hier ja nicht vor.



  • double Betrag(double x) { 
    return ((x<0) ? -x : x);} 
    
    bool gut_genug (double x, double a) { 
    return (Betrag(x*x-a) <= 1e-15); } 
    
    double wurzeliter (int i, double xn, double a)
     { 
    if (gut_genug(xn,a)||(i>1000)) 
    return xn; 
    
    cout << "i= " << i << ", x= " << xn << endl; 
    wurzeliter(i+1,(xn+a/xn)*0.5,a); 
    return 0; 
    } 
    
    double wurzel (double a)
    {
    
    //A: Ungefähr so als schleife, ungetestestet
    int i,xn=0;
    while(!(gut_genug(xn,a)||(i>1000)))
    {
    cout << "i= " << i << ", x= " << xn << endl; 
    
    i= i+1;
    xn= (xn+a/xn)*0.5;
    
    }
    
    // b: Rekursive
     return wurzeliter(1,1.0,a); 
    
    } 
    
    int main () { 
    cout.precision(20); cout << wurzel(2) << endl; 
    return 0;}
    

Anmelden zum Antworten