Rekursiv in C

Dieses Thema im Forum "Programmieren" wurde erstellt von dragon_MF, 16. November 2003.

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. dragon_MF

    dragon_MF Megabyte

    Registriert seit:
    17. August 2001
    Beiträge:
    1.109
    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

    Registriert seit:
    17. August 2001
    Beiträge:
    1.109
    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

    Registriert seit:
    17. August 2001
    Beiträge:
    1.109
    Alles klar. Sehr nützlich...fragt man sich doch gleich, warum es noch die kompliziertere Variante gibt... ;-P
    Danke nochmals.
    cu

    Martin
     
Status des Themas:
Es sind keine weiteren Antworten möglich.

Diese Seite empfehlen