Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Theoretische Informatik (http://www.informatikerboard.de/board/board.php?boardid=5)
--- Ablauf einer Rekursiven Funktion (http://www.informatikerboard.de/board/thread.php?threadid=2162)
Geschrieben von Tina92 am 11.03.2015 um 17:16:
Ablauf einer Rekursiven Funktion
Meine Frage:
Hi Leute,
ich hätte mal eine Frage zu den rekursiven Funktionen und wie diese eigentlich genau funktionieren.
Hab als Beispiel einmal die Fakultätsfunktion geschrieben:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
|
public class Fakult
{
public static void main (String[]args)
{
System.out.println(fakult(6));
}
public static double fakult (int zahl)
{
if (zahl>0)
{
return zahl*fakult(zahl-1);
}
else
{
return {1;
}
}
}
|
|
Meine Ideen:
Was ich jetzt nicht verstehe, was genau in dieser Zeile passiert:
return zahl*fakult(zahl-1);
Vielen Dank für Eure Hilfe :-)
Geschrieben von eulerscheZahl am 11.03.2015 um 17:33:
Das Programm springt immer wieder in eine Unterfunktion.
Ich habe mal ein paar Kontrollausgaben ergänzt:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
|
public static double fakult(int zahl) {
if (zahl > 0) {
System.out.println(" ".substring(zahl) + zahl
+ " vor rekursivem Aufruf");
double ergebnis = zahl * fakult(zahl - 1);
System.out.println(" ".substring(zahl) + zahl
+ " nach rekursivem Aufruf");
return ergebnis;
} else {
return 1;
}
}
6 vor rekursivem Aufruf
5 vor rekursivem Aufruf
4 vor rekursivem Aufruf
3 vor rekursivem Aufruf
2 vor rekursivem Aufruf
1 vor rekursivem Aufruf
1 nach rekursivem Aufruf
2 nach rekursivem Aufruf
3 nach rekursivem Aufruf
4 nach rekursivem Aufruf
5 nach rekursivem Aufruf
6 nach rekursivem Aufruf |
|
Das ist der zeitliche Ablauf: die Funktion ruft sich selbst auf, wartet auch ein Ergebnis der Unterfunktion und gibt dieses dann zurück.
Geschrieben von Tina92 am 14.03.2015 um 11:04:
Vielen Dank für deine Antwort.
Geschrieben von Tina92 am 05.04.2015 um 19:37:
Hey :-)
Ich muss das Thema leider noch einmal aufgreifen, da ich nicht weiterkomme.
Den folgenden Code habe ich soeben mal schnell geschrieben:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
|
public class Rekursiv
{
public static void main (String[]args)
{
System.out.println(versuch(3));
}
public static int versuch(int zahl)
{
int ausgabe = 1;
if (zahl>0)
{
ausgabe = 2+zahl*versuch(zahl-1);
}
else
{
return 1;
}
return ausgabe;
}
}
|
|
Könnt ihr mir bitte sagen, wie jetzt hier als Ergebnis 26 rauskommt?
Vielen Dank
Geschrieben von eulerscheZahl am 05.04.2015 um 20:12:
Für zahl = 3 ist das Ergebnis: 2 + 3 * versuch(2)
versuch(2) ist 2 + 2 * versuch(1)
versuch(1) ist 2 + 1 * versuch(0)
versuch(0) ist 1, das Ergebnis eingesetzt ergibt versuch(1) = 2+1*1 = 3
versuch(2) = 2+2*3 = 8
versuch(3) = 2+3*8 = 26
Geschrieben von Tina92 am 05.04.2015 um 21:22:
Vielen Dank für deine Antwort :-)
Geschrieben von Michael90 am 06.04.2015 um 13:12:
Zu diesem Thema hätte ich auch eine Frage:
Warum wird a am Ende wieder positiv und nicht negativ, also -1,-2,-3,-4 ?
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
|
public class Rekursiv
{
public static void main(String[] args)
{
rekursion(5);
}
private static void rekursion(int a)
{
--a;
System.out.println(a);
if (a!=0)
{
rekursion(a);
}
System.out.println(a);
// Wenn a = 0, dann erfolgt hier die Ausgabe des Wertes
// a wird um eins verringert, somit auf -1,
// Warum wird a hier wieder positiv und nicht negativ, also -1,-2,-3,-4 ?
}
} |
|
Geschrieben von eulerscheZahl am 06.04.2015 um 13:25:
Du gibst am Ende wider das a der aufrufenden Funktion aus.
rekursion(3) setzt a auf 2, gibt eine 2 aus, ruft rekursion(2) auf (Ausgabe: 1 0 0 1) und gibt die 2 dann erneut aus.
Geschrieben von Michael90 am 12.04.2015 um 12:19:
Danke dir für die Antwort. Also verstehe ich das richtig, dass es folgendermaßen abläuft, dass erst (angenommener Wert = 3) von 3,2,1,0 abläuft und dann wieder 1,2,3 zurückläuft?
Geschrieben von eulerscheZahl am 12.04.2015 um 18:10:
Die Funktion springt in eine Unterfunktion (in dem Fall in sich selbst) rein und arbeitet diese ab. Danach führt sie sich selbst weiter aus. Wie Klammern, die sich gegenseitig umschließen: {[()]}
Und sowohl bei der öffnenden, als auch bei der schließenden Klammer hast du eine Ausgabe.
Forensoftware: Burning Board, entwickelt von WoltLab GmbH