Kann leider Funktion nicht nachvollziehen



  • Sehr geehrtes Forum,

    ich habe mir im Internet ein paar Aufgaben zur C-Programmierung rausgesucht.

    Diese Aufgabe kann ich jedoch nicht nachvollziehen- mir ist nicht klar wie die anscheinend rekursive Funktion sich verhält damit vei einer Eingabe von "5" die Ausgabe "5,441861" herauskommt.

    Habe auch schon die einzelnen Schritte im Compiler nachverfolgt- jedoch versteh ich es immer noch nicht 😞 . Vielen Dank für die Hilfe.

    Folgender Quelltext:

    #include <stdio.h>
    float funk (int zahl);
    void main ()
    {
    int i;
    printf("\n Eingabe");
    scanf("%d", &i);
    printf("\n \n Ausgabe(%d) = %f",i,funk(i));
    }
    float funk (int zahl)
    {
    float erg=0.0;
    if (zahl>0)
    erg=zahl+funk(zahl/3) / funk(zahl-1);
    else erg=1.0;
    return(erg);
    }



  • Nimm einen Stapel Zettel (so 8cm x 8cm Notizzettel).

    Wenn ein Funktionsaufruf kommt, nimmst du einen neuen Zettel, legst ihn auf den Stapel/vor dir hin und schreibst da die Zwischenergebnisse drauf.
    Beim return merkst du dir das Ergebnis, schmeißt den obersten Zettel weg und notiest das gemerkte auf den (jetzt) obersten Zettel und machst da weiter.

    Bedenke, das funk einen Ganzzahlwert erhält, aber ein float zurück gibt.



  • Das Prinzip wie eine rekursive Funktion arbeitet ist mir klar. Beispiel Türme von Hanoi oder Fakultätenberechnung rekursiv kann ich nachvollziehen.

    Hier werde ich jedoch durch die Schreibweise verunsichert.

    ist folgendes Konstrukt jetzt eine Schleife?
    **
    float funk (int zahl)
    {
    float erg=0.0;
    if (zahl>0)
    erg=zahl+funk(zahl/3) / funk(zahl-1);
    else erg=1.0;
    return(erg);
    }
    **

    Bei der Zeile kommt der Funktionsname nochmal vor "funk(zahl/3)" und "funk(zahl-1" . Springt da die Funktion nochmal oder was wird da genau gemacht?

    erg=zahl+funk(zahl/3) / funk(zahl-1);

    Danke für die Hilfe.


  • Mod

    Da wird die Funktion eben 2x aufgerufen. Eine Schleife ist da nicht direkt; nur in dem Sinne, dass Rekursion, wie eine Schleife auch, den gleichen Code immer wieder ausführt.

    PS: Benutze Codetags für deinen Code, nicht fettschreibe-Tags! Der Button mit dem "C", nicht der mit "B".



  • Hab jetzt nochmal ein paar Beispiele und den Aufbau von rekursiven Funktionen
    aus dem Internet durchgepaukt.

    Komme allerdings immer noch nicht drauf wie das funktionieren soll:

    erg=zahl+funk(zahl/3) / funk(zahl-1);
    

    Kann mir jemand ´die ersten Schritte aufzeigen /vorrechnen?

    Bin am Verzweifeln 😕

    Danke und Gruß



  • Schau dir mal die Fibonacci-Folge an.
    Diese solltest du auch per Hand durchrechnen und verstehen können.

    Hier der (nicht-optimierte) Code:

    unsigned long fib(unsigned long n)
    {
      if (n <= 2)
        return 1;
    
      return fib(n-1) + fib(n-2);
    }
    

    Und dann solltest du auch deinen Code verstehen.


Log in to reply