1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Rekursiv in C

Discussion in 'Programmieren' started by dragon_MF, Nov 16, 2003.

Thread Status:
Not open for further replies.
  1. dragon_MF

    dragon_MF Megabyte

    Lo!

    Ich fange erst an C zu lernen, also bitte um Nachsicht, falls die Frage allzu primitiv ist.
    Ich habe die Aufgabe eine rekursive Funktion zu schreiben, die 10 (aufeinanderfolgende) Glieder einer arithmetischen Folge ( a(n)=a(n-1)+d ) ausgibt und folgende Funktion geschrieben:

    float af(glied,dw,runde)
    {
    int zw;
    runde=runde++;
    if (runde<11) zw=dw+af(glied-dw,dw,runde);
    printf("%d\t",zw);
    return(zw);
    }

    glied - beim erstmaligen aufruf der startwert (vom benutzer eingegeben)
    dw - Schrittweite (d)

    Das funktioniert zwar, aber irgendwie frag ich mich, ob das wirklich rekursiv arbeitet oder ob ich das Prinzip noch nicht richtig verstanden habe...?
    Danke.
    Gruß

    Martin
     
  2. Kokomiko

    Kokomiko Guest

    Das ist so zu verstehen wie
    Code:
    if (runde>10) 
       return dw;
    else
       return dw + af(glied-dw,dw,runde+1);
    Allgemein sieht dieses Sprachkonstrukt so aus:

    <condition> ? <statement if condition true> : <statement if condition false>

    Mit anderen Worten: Das ist so eine Art kompaktes if-else-Konstrukt. Vor dem Fragezeichen kommt eine Bedingung, danach erst das, was geschehen/berechnet/aufgerufen werden soll, wenn sie zutrifft, dann ein Doppelpunkt, dann das, was geschehen/berechnet/aufgerufen werden soll, wenn sie nicht zutrifft.

    Alles klar? ;)
     
  3. dragon_MF

    dragon_MF Megabyte

    Okay danke. Ja wie gesagt, etwas unüblich war es noch.
    Die Ausgabe ist übrigens gewollt.

    Die Zeile mit
    return (runde>10) ? dw : versteh ich aber leider nicht. Ich weiß weder in welchen Zusammenhang das Fragezeichen noch der Doppelpunkt steht und welche Funktion sie haben...
    Aber gut, ich will ja nicht unnötig Arbeit machen. Ich danke vielmals und verabschiede mich.
    Gruß

    Martin
     
  4. Kokomiko

    Kokomiko Guest

    Das ist rekursiv. Rekursiv bedeutet, daß eine Funktion sich selbst zur Berechnung eines Teilergebnisses aufruft, das sie dann weiterverwendet. Allerdings sind ein paar kleinere Mängel in Deiner Funktion.

    runde++ ist äquivalent zu runde=runde+1. Du brauchst also nicht runde=runde++; zu schreiben. runde++; genügt. Im Grunde brauchst Du das aber gar nicht. Außerdem wird zw nicht initialisiert, falls runde >= 11.

    Du könntest also schreiben:

    float af(float glied, float dw,int runde)
    {
    int zw = dw;
    if (runde<=10) zw+=af(glied-dw,dw,runde+1);
    printf("%d\t",zw);
    return(zw);
    }

    runde wird dann inkrementiert, bevor auf <11 getestet wird.
    Ohne die Protokollausgabe könntest Du schreiben:

    float af(float glied,float dw,int runde)
    {
    return (runde>10) ? dw : dw + af(glied-dw,dw,runde+1);
    }
     
  5. Kokomiko

    Kokomiko Guest

    Weil Du damit {...}-Blöcke verarbeiten kannst.
     
  6. dragon_MF

    dragon_MF Megabyte

    Alles klar. Sehr nützlich...fragt man sich doch gleich, warum es noch die kompliziertere Variante gibt... ;-P
    Danke nochmals.
    cu

    Martin
     
Thread Status:
Not open for further replies.

Share This Page