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