C-Programm Ausgabe ?



  • Habe folgendes C-Programm

    #include <iostream>
    using namespace std;

    int func(int n)
    {
    if (n == 1) return 2;
    else{
    cout << n << endl;
    return 2 * func(n-1);
    }
    }
    void main ()
    {
    int v[5] = {1, 2, 3, 4, 5};
    int a = v[4] - v[1];
    cout << a << endl;
    cout<< func(v[a]);
    }

    Als Ausgabe erhalte ich:
    3
    4
    3
    2
    16
    Jedoch verstehe ich nicht warum ich diese Ausgabe bekomme. Die erste 3 ist das int a. Dann die 4 ist das n was an die Funktion übergeben wird. Aber wie kommt man auf die weiteren Zahlen?



  • Erstens ist das kein C, sondern C++ (erkennbar an <iostream>, namespace und cout) 😉
    Zweitens ist das Programm nicht Standard-gerecht (richtig wäre "int main()"
    Und drittens: Die übrigen Ausgaben stammen von dem "cout<<n<<endl;" in der Funktion func() - die sich rekursiv immer wieder selbst aufruft (a=3 -> v[a]=4), der letzte Wert (16) ist dann die Rückgabe der Funktion.

    (btw, func() ist eine rekursive (und recht langsame) Methode, 2^n zu berechnen ;))

    PS: Und cpp-Tags sind durchaus hilfreich, um deine Code-Fragmente übersichtlicher zu gestalten 😉



  • Danke für die schnelle Antwort aber ich habe das Programm immernoch nicht verstanden.
    Erst haben wir:
    a = 3
    dann v[a] = 4
    und was kommt dann?
    Was macht er genau bei return 2 * func(n-1) ?



  • Beachte auch wo ein array anfängt zu zählen!
    Nämlich bei null!
    d.h.

    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => ? (meistens null)

    Un da das eine rekursive funktion ist wird der rückgabe wert (2) noch 3 mal mit 2 multiplitziert also 2*2*2*2 = 16



  • Storm.Xapek.de schrieb:

    [5] => ? (meistens null)

    v[5] ist undefiniert - und wenn du Pech hast, liegt auf der entsprechenden Adresse bereits die nächste Variable.

    Martinho schrieb:

    Was macht er genau bei return 2 * func(n-1) ?

    Er ruft die Funktion selber mit dem Parameterwert n-1 auf, multipliziert das zurückgekommene Ergebnis mit 2 und gibt das Resultat nach oben weiter.



  • Das ein Array anfängt bei 0 zu zählen ist mir auch klar. Sonst wäre ja schon die erste Ausgabe falsch. Mein Problem liegt in der rekursiven Funktion.
    a = 3
    v[a] = v[3] = 4
    return 2 * func(4-1)
    ruft er dann 2 * func(4-1) auf ?
    das wäre dann ja 2 * 3 = 6 und nicht 16



  • 2 * func(n-1)
    

    ruft die Funktion mit dem Parameter (n-1)=3 auf, von dort aus wird die Funktion wieder (mit Parameter 2) aufgerufen,... - und in jeder Ebene wird der zurückgegebene Wert mit 2 multipliziert.

    func(4) -> 2*func(3)
      func(3) -> 2*func(2)
        func(2) -> 2*func(1)
          func(1) -> 2 //hier greift das if()
        -> 4
      -> 8
    ->16
    

Anmelden zum Antworten