Wie komme ich auf das Ergebnis?
-
Hey ich versuche gerade einen Code nachzuvollziehen. Ich bin nicht sehr gut im Programmieren und lerne es gerade noch aber irgendwie verzweifle ich gerade total.
Wie komme ich bei folgendem Code auf das Ergebnis 11?
int f ( int v )
{
if ( v == 1 || v == 0)
return 1;
if ( v%2 == 0)
return f (v/2)+2;
else
return f (v-1)+3;
}
int main ( )
{
cout << f (7) ;
}Wäre super wenn es mir einer erklären könnte. Ich vermute, dass es irgendwie mit dem f bei "return f (v-1)+3" zusammenhängt.
MfG
Jan
-
1. Das: % ist der Modulo Operator.
2. f(x) ruft die Funktion einfach rekursiv auf.Damit solltest du das Problem lösen können.
-
Jan25HH schrieb:
Wie komme ich bei folgendem Code auf das Ergebnis 11?
int f ( int v ) { if ( v == 1 || v == 0) return 1; if ( v%2 == 0) return f (v/2)+2; else return f (v-1)+3; } #include <iostream> int main ( ) { cout << f(7); }cout << f(7);also:
int f (7) { // if ( v == 1 || v == 0) // return 1; // if ( v%2 == 0) // return f (v/2)+2; // else return f (v-1)+3; // <- }also
int g(int v) { return f(v)+3; } int f(6) { // if ( v == 1 || v == 0) // return 1; if ( v%2 == 0) return f (v/2)+2; // <- // else // return f (v-1)+3; }usw.
bb
-
Jan25HH schrieb:
#include <iostream> using namespace std; int f(int v) { if (v == 1 || v == 0) return 1; if (v%2 == 0) return f(v/2) + 2; else return f(v-1) + 3; } int main() { cout << "6 % 2 = " << 6%2 << endl; cout << "7 % 2 = " << 7%2 << endl; cout << "f(7) = " << f(7) << endl; }Wäre super wenn es mir einer erklären könnte.
MfG
JanOk, mal aufdröseln das ganze, du rufst die Funktion f auf und übergibst ihr einen Integerwert 7, die erste IF bedingung prüft ob dein übergebener Wert = oder 1 ist.
Da er das nicht ist, geht es in der nächsten IF Bedingung weiter, dort wird mit Modulo (http://de.wikipedia.org/wiki/Division_mit_Rest#Modulo) geprüft ob dein übergebener Wert garde oder ungrade ist, dabei steht das Ergebnis 0 für grade (kein Rest) und 1 für ungrade. (In diesem Fall, also Wert%2).
Je nachdem wird dann die Funktion selber erneut aufgerufen und ihr entweder bei graden Zahlen dein Wert/2 übergeben und zwei dazugezählt, oder bei ungraden Zahlen dein Wert-1 übergeben und 3 dazu gezählt.
Daraus ergibt sich dann:
Dein Wert 7
7%2 = 1 (also Rest und ungrade Zahl)
Demnach gibt dir deine Funktion f(7-1)+3 Zurück aber das ist auch wieder rekursiv (http://de.wikipedia.org/wiki/Rekursiv) und wird demnach auch nochmal durch diese Funktion geschickt als das 7-1 = 6 also return f(6) + 3, das kann man ne ganze Weile lang machen und so ist diese Funktion auch aufgebaut. Dabei schützt die erste IF bedingung eigendlich nur vor einem, einer Division durch null.
Hoffe das hilft dir ein bisschen zum Verständnis.
[Edit: bechstaben Verwuchselt und Proggy mal in lesbare Form gebracht]
-
Also ich glaube ich habe es verstanden:
f(7):
f(6) + 3
f(3) + 2 + 3
f(2) + 3 + 2 + 3
f(1) +3 +2 +3 +2
1==1 gibt 1 aus und ich habe am ende
3+2+3+2+1= 11 ?Wenn das richtig sein sollte bedanke ich mich sehr. ich stand da doch sehr aufm schlauch und habe immer das f mit reingerechnet aber das das rekursiv ist habe ich auch nicht gesehen.
Vielen Dank an euch alle!
-
Das ist exakt, der Sinn dieser Übung liegt im grundlegenden darin ein Programm zu lesen und zu verstehen warum das Ergebnis kommt. Solche Funktionen in dieser Art werden dir im wahren Leben selten über den Weg laufen, aber wenn man ungewöhnliche Ausgaben bekommt ist es gut nachvollziehen zu können was passiert.