rekursive Funktion!...aber wie?



  • Servus

    fällt es nur mir so schwer, oder ist das Theme Rekursion wirklich so verzwickt. Bis jetzt hatte ich nie so richtig Probleme, aber die Rekursionen machen mir echt zu schaffen.
    Hab hier mal eine Funktion dargestellet in der eine do...while-SChleife läuft die ich gern rekursiv lösen möchte. Kann mir von euch Profis einer behilflich sein? Vielleicht könnt ihr mir auch sagen ob ich ansatzweise richtig mit dem Selbstaufruf angefangen habe.

    /*********************************************************************************/
    /* mit "gcc -lncurses -lm" compilieren                                           */
    /*********************************************************************************/
    #include <stdio.h>
    #include <math.h>
    #include <ctype.h>
    
    #define SCHALL 330.0
    #define ERDBESCHL 9.81
    #define ABWEICHUNG 0.001
    
    void schacht_tiefe(double rekursion, double tiefe1, double tiefe2, double zeit);
    
    double rekursion;
    
    void main(void)
    {
      double tiefe1, tiefe2, zeit;
    
      rekursion = 0;
      tiefe1 = 6;
      tiefe2 = 6;
      zeit = 2;
    
      schacht_tiefe(rekursion, tiefe1, tiefe2, zeit);
    }
    /*********************************************************************************/
    void schacht_tiefe(double rekursion, double tiefe1, double tiefe2, double zeit)
    {
        double diff;
      int i = 0;
      char str[100];
    //  do
      if (fabs(diff) > ABWEICHUNG);
      {
        i++;
        rekursion = .5 * (tiefe1+tiefe2);
        diff = sqrt(2*rekursion/ERDBESCHL)
    	+rekursion/SCHALL - zeit;
    
        if (diff   >= 0.0)
        {
    //      tiefe1 =  rekursion;
          schacht_tiefe(rekursion, rekursion, tiefe2, zeit);
        }
        else
        {
    //      tiefe2 =  rekursion;
          schacht_tiefe(rekursion, tiefe1, rekursion, zeit);
        }
        printf("\n\t\t %1d .Berechnungslauf: %5.2f Meter",i,rekursion);
      }
    //  }while (fabs(diff) > ABWEICHUNG);
    }
    /*********************************************************************************/
    

    Danke schon mal für eure Hilfe

    Gruß Rekursator



  • Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum Linux/Unix in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Du definiert am Anfang der Funktion eine Variable diff, die nicht initialisiert, aber abgefragt wird. Bei jeder Rekursion wird die Variable neu erzeugt. Der anschließend zugewiesene Wert wird jedoch niemals weiterverarbeitet.

    Erweitere die Funktion um einen Parameter für diff, der für das erste Mal mit einem Wert größer ABWEICHUNG initialisiert wird. Eine weitere Möglichkeit ist die Definition als static. Jedoch muss auch hier eine Initialisierung erfolgen.



  • wenn ich deinen code richtig verstanden habe, dann geht es um ein gallileo-mäßiges fall-experiment. du läßt einen körper fallen und wartest auf das aufprallgeräusch. das programm soll aus der zeitspanne zwischen dem loslassen des körpers und dem eintreffen des aufprallgeräusches die falltiefe unter berücksichtigung von erdbeschleunigung und schallgeschwindigkeit errechnen.

    du versuchst, das problem rekursiv mit intervallschachtelung zu lösen. das programm erstellt eine annahme über das intervall, in dem die falltiefe liegen muss und bestimmt mit einer proberechnung, ob die tatsächliche falltiefe in der oberen oder unteren hälfte des intervalls liegt. anschließend ruft sich die funktion mit dem kleineren intervall selbst auf. dies wird so lange fortgesetzt, bis das intervall ausreichend klein geworden ist (rekursionsende-bedingung).

    ich habe in deinem code drei fehler entdeckt. der erste ist der, den schmidtke bereits erwähnt hat. if(fabs(diff)>ABWEICHUNG) muß hinter die berechnung von diff gesetzt werden.

    der zweite fehler ist ein typischer anfängerfehler, der einem bei cut-and-paste im code leicht unterlaufen kann. du hast ein semikolon hinter der if-anweisung stehen! das der compiler das nicht anmahnt, liegt nicht etwa daran, daß dein compiler fehlerhaft wäre, sondern daran, daß dein code nach sprachdefinition syntaktisch absolut korrekt ist! ich möchte jetzt nicht im detail erklären warum, da würden wir morgen noch hier sitzten. auf jeden fall muß das dingens weg.

    der dritte fehler ist, daß du das suchintervall beim ersten aufruf der funktion falsch setzt:

    tiefe1 = 6;
    tiefe2 = 6;
    

    anfang und ende des intervalls sind gleich! ich vermute, du hast

    tiefe1 = 0;
    tiefe2 = 6;
    

    gemeint.

    ansonsten ist noch anzumerken, daß der funktions-parameter rekursion überflüssig ist. es würde reichen, ihn als lokale variable zu deklarieren. das wird daran deutlich, daß dein programm diesen parameter vor seiner ersten verwendung überschreibt.



  • Erstmal ist der Code geklaut,...und zweitens kannst du dir einfach für rekursive Funktionen merken,es wird anstatt einer Iteration die abfrage des endes deines Allgos durch ein if ersetzt meistens im verbund eines n--;und in deiner Funktion die Funktion selber nochmal aufgerufen.Also es findet in deiner Funktion ein rekursiver Funktionsaufruf statt.Eigentlich ganz einfach oder? 😃


Anmelden zum Antworten