actionbrowser.com
Rekursion [ Bearbeiten] Eine Funktion, die sich selbst aufruft, wird als rekursive Funktion bezeichnet. Den Aufruf selbst nennt man Rekursion. Als Beispiel dient die Fakultäts-Funktion n!, die sich rekursiv als n(n-1)! definieren lässt (wobei 0! = 1). Hier ein Beispiel dazu in C: #includeint fakultaet ( int a) { if ( a == 0) return 1; else return ( a * fakultaet ( a -1));} int main () int eingabe; printf ( "Ganze Zahl eingeben: "); scanf ( "%d", & eingabe); printf ( "Fakultaet der Zahl:%d \n ", fakultaet ( eingabe)); return 0;} Beseitigung der Rekursion [ Bearbeiten] Rekursive Funktionen sind in der Regel leichter lesbar als ihre iterativen Gegenstücke. Die verschiedenen Rekursionsarten - Gehaxelts Blog. Sie haben aber den Nachteil, dass für jeden Funktionsaufruf verhältnismäßig hohe Kosten anfallen. Eine effiziente Programmierung in C erfordert also die Beseitigung jeglicher Rekursion. Am oben gewählten Beispiel der Fakultät könnte eine rekursionsfreie Variante wie folgt definiert werden: int fak_iter ( int n) int i, fak; for ( i = 1, fak = 1; i <= n; i ++) fak *= i; return fak;} Diese Funktion liefert genau die gleichen Ergebnisse wie die obige, allerdings wurde die Rekursion durch eine Iteration ersetzt.
Zunächst einmal haben wir eine Fallunterscheidung, bei der geprüft wird, wie viele Scheiben auf Stapel a liegen. Liegt dort nur eine, so legen wir sie einfach direkt auf Stapel c. Beim ersten Durchlauf ist Stapel a der Source-Stapel, weshalb n definitiv nicht eins ist. Wir springen also in den else-Block und führen die dortigen Anweisungen aus. Bei diesen handelt es sich um rekursive Aufrufe. Als Erstes rufen wir, wie wir bereits in Schritt eins festgelegt haben, dieselbe Funktion für n-1 nochmal auf. Haben wir das hinter uns, können wir mit dem nächsten Aufruf weitermachen. Recursion c++ beispiel worksheet. Dieser macht dasselbe, vertauscht aber unsere Türme, damit wir alles, was wir nach b gestapelt haben weiter nach h stapeln können. Als Letztes bewegen wir jetzt alles nach g. Du hast jetzt ein kompliziertes Problem mit sehr wenig Code gelöst. Wenn du immer noch nicht genug hast, kannst du ja mit einigen Werten experimentieren.
Um sich das zu veranschaulichen, kann man sich "von Hand" überlegen, in welcher Reihenfolge die Aufrufe geschehen. Um Platz zu sparen ersetze ich hier in jeder Ebene alle Aufrufe von Unterfunktionen, obwohl sie im Programm nacheinander (und nicht gleichzeitig) gesehen 0. Ebene: hanoi(3, 'A', 'B', 'C'); 1. Rekursion - was ist das? Rekursion Programmierung (Beispiele). Ebene: hanoi(2, 'A', 'C', 'B'); move('A', 'C'); hanoi(2, 'C', 'B', 'A'); 2. Ebene: hanoi(1, 'A', 'B', 'C'); hanoi(1, 'C', 'B', 'A'); hanoi(1, 'C', 'A', 'B'); move('C', 'B'); 3. Ebene: move('A', 'B'); move('C', 'A'); Zuerst wird also ein Ring von A nach B bewegt. Das Programm hat drei Funktionsaufrufe gebraucht, um das herauszufinden. Typisch für rekursive Funktionen sind diese Schritte: Eine Abbruchbedingung, die dafür sorgt, dass keine endlose Schleife entsteht Ein kleiner Teil des Problems wird in der Funktion selbst gelöst, der Rest wird durch rekursives von sich selbst gelöst Wenn nötig werden die beiden Lösungen kombiniert. Noch ein Beispiel: Merge Sort Die Türme von Hanoi sind sind ein eher akademisches Beispiel.
234567)*(x+0. 987654);} deklarieren und definieren, und den Bisektionsalgorithmus in Version 3. mit ihr aufrufen: x0 = Bisect3(g, a, b, 1e-12) Bemerkung: Da wir unsere als Argument in Bisect3 übergebene Funktion func ein reiner INPUT-Parameter ist, sollten wir sie noch mit const kennzeichnen. Allerdings ist die richtige Kennzeichnung des ersten Arguments in Bisect3 double Bisect3(double (* const func)(double), const double a, const double b, const double eps=1e-6); am Anfang etwas verwirrend. Recursion c++ beispiel function. Unser Programm arbeitet zufriedenstellend für f ( x) = sin( x) - x /2 und liefert für die Eingabeparameter a = 1 und b = 2 die richtige Lösung x 0 = 1. 89549, desgleichen für a = 0 und b = 2 allerdings wird hier bereits die (triviale) Lösung x 0 = 0 nicht gefunden, da a = 0 eingegeben wurde. Bei den Eingaben a = 0, b = 1 bzw. a = - 1, b = 0. 1 ( x 0: = 0 [ a, b]) bricht das Programm nach einiger Zeit mit Segmentation fault ab, da die Rekursion nicht abbricht und irgendwann der für Funktionsaufrufe reservierte Speicher ( Stack) nicht mehr ausreicht.
Mein Compiler würde in diesem Fall einfach das n zurückgeben. zurückgeber schrieb: Es ist aber nicht definiert, was dann zurückgegeben wird... Sowas sollte man vermeiden, stimmst du mir da zu? Rekursion ist eigentlich ganz einfach zu verstehen. Der OP hat hier aber offenbar noch nichtmal Funktionen verstanden. Erstmal laufen lernen, dann rennen! Weil das n wohl gerade zufällig in dem Register liegt, dass auch für den Rückgabewert verwendet wird. Das kann ganz schnell schief gehen. _matze schrieb: jepp, so ist es. (jepp==ja) switch(enumAnswer) { case Ja: case Jepp: std::cout << "Alles klar! "; break;} std::cout "Alles klar! "; da fehlt der links-shift. +fricky schrieb: Klugsch... Bashar ich hab die Funktionen schon vertstanden. Recursion c++ beispiel functions. Was jedoch nicht ganz in meinen Kopf reingeht ist, wie sich die Funktion selber aufruft und gleichzeitig ein Rückgabewert sein kann. Thx für die bisherigen Antworten. Der Hans schrieb: Das ist schon ein kleiner Widerspruch, aber na ja... Deine Funktion hat einen Rückgabewert.
Es hat den Nachteil, dass es die Einkapselung bricht; Der Aufrufer kann die Ausgabe ändern, indem er die Karte mit falschen Werten auffüllt.