rekursion:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
rekursion:start [2024/09/08 13:28] – [Aufgabe 3: Die Türme von Hanoi] Martin Pabst | rekursion:start [2024/11/15 09:09] (aktuell) – [Aufgabe 5: größter gemeinsamer Teiler] Martin Pabst | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== 1. Rekursion ====== | + | ====== 1. Rekursion |
===== Beispiel 1: Berechnung von Fakultäten ===== | ===== Beispiel 1: Berechnung von Fakultäten ===== | ||
Zeile 41: | Zeile 41: | ||
<WRAP center round info 60%> | <WRAP center round info 60%> | ||
**Definition: | **Definition: | ||
- | Von **Rekursion** spricht man, wenn sich eine Methode entweder direkt selbst aufruft oder über eine Aufrufkette (z.B. Methode a ruft Methode b auf, die ruft Methode c auf, diese wiederum ruft Methode a auf). \\ \\ | + | Von **Rekursion** |
- | **Wichtig: | + | **Wichtig:** |
+ | | ||
+ | * Ruft sich die rekursive Methode genau ein Mal auf, so spricht man von **linearer Rekursion**. Ruft sie sich mehrmals auf, so spricht man von **verzweigter Rekursion** (siehe Aufgabe 1 unten). | ||
</ | </ | ||
Zeile 50: | Zeile 52: | ||
<WRAP center round info 60%> | <WRAP center round info 60%> | ||
Um zu verstehen, wieso ein rekursiver Aufruf einer Methode überhaupt funktionieren kann stellen Sie sich am besten vor, dass der Computer bei jedem Aufruf der Methode '' | Um zu verstehen, wieso ein rekursiver Aufruf einer Methode überhaupt funktionieren kann stellen Sie sich am besten vor, dass der Computer bei jedem Aufruf der Methode '' | ||
- | TODO < | + | |
</ | </ | ||
Zeile 61: | Zeile 63: | ||
<WRAP center round info 60%> | <WRAP center round info 60%> | ||
Die [[https:// | Die [[https:// | ||
+ | $$ f_0 = 1 $$ | ||
$$ f_1 = 1 $$ | $$ f_1 = 1 $$ | ||
- | $$ f_2 = 1 $$ | + | $$ f_n = f_{n-2} + f_{n-1}\ \ \mathrm{für}\ \ n > 1 $$ |
- | $$ f_n = f_{n-2} + f_{n-1}\ \ \mathrm{für}\ \ n > 2 $$ | + | |
Jedes Folgenglied ist also die Summe der beiden vorhergehenden Folgenglieder. Hier die ersten Glieder: | Jedes Folgenglied ist also die Summe der beiden vorhergehenden Folgenglieder. Hier die ersten Glieder: | ||
$$1,\ 1,\ 2,\ 3,\ 5,\ 8,\ 13,\ 21,\ 34,\ 55,\ \ldots$$ | $$1,\ 1,\ 2,\ 3,\ 5,\ 8,\ 13,\ 21,\ 34,\ 55,\ \ldots$$ | ||
Zeile 125: | Zeile 127: | ||
</ | </ | ||
- | ====== Aufgabe 2: Fraktaler Baum ====== | + | ===== Aufgabe 2: Fraktaler Baum ===== |
<WRAP center round todo 80%> | <WRAP center round todo 80%> | ||
Erstelle mit Hilfe rekursiver Methodenaufrufe ein Programm, das einen fraktalen Baum zeichnet. Hier die Zeichnung nach der 12. Iteration: \\ | Erstelle mit Hilfe rekursiver Methodenaufrufe ein Programm, das einen fraktalen Baum zeichnet. Hier die Zeichnung nach der 12. Iteration: \\ | ||
Zeile 137: | Zeile 139: | ||
</ | </ | ||
- | [[.fraktalerBaum: | + | [[.fraktalerBaum: |
<WRAP center round tip 60%> | <WRAP center round tip 60%> | ||
Zeile 187: | Zeile 189: | ||
</ | </ | ||
- | [[.hanoi: | + | [[.hanoi: |
+ | |||
+ | |||
+ | <WRAP center round tip 60%> | ||
+ | **Für Interessierte: | ||
+ | Stellen Sie sich ein Array mit '' | ||
+ | [[.quicksort: | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Aufgabe 4: Floodfill ===== | ||
+ | <WRAP center round info 60%> | ||
+ | Gegeben ist eine Pixelgrafik mit einem beliebig geformten, zusammenhängenden Gebiet von Pixeln einer Farbe. Gesucht ist ein Algorithmus, | ||
+ | Ein Algorithmus, | ||
+ | \\ \\ | ||
+ | Gegeben ist das Programmgerüst unten, bei dem bereits dafür gesorgt ist, dass bei Mausklick auf den Punkt (x, y) die Methode '' | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | new FloodfillExample(); | ||
+ | |||
+ | |||
+ | class FloodfillExample extends Bitmap { | ||
+ | |||
+ | | ||
+ | super(100, 100, 0, 0, 600, 600); | ||
+ | drawTestImage(); | ||
+ | } | ||
+ | |||
+ | |||
+ | void fill(int x, int y, int newColor) { | ||
+ | int oldColor = getColorAsInt(x, | ||
+ | if(newColor == oldColor) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | fillIntern(x, | ||
+ | } | ||
+ | |||
+ | | ||
+ | // TODO: | ||
+ | // - Überprüfen, | ||
+ | // - Überprüfen, | ||
+ | // - ggf. Einfärben des Punktes (Methode setColor), und rekursive Methodenaufrufe für die benachbarten Punkte | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | | ||
+ | Position position = this.screenCoordinatesToBitmapCoordinates(x, | ||
+ | this.fill(position.x, | ||
+ | } | ||
+ | |||
+ | void drawTestImage() { | ||
+ | for (int n = 0; n < 6000; n++) { | ||
+ | | ||
+ | |||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | [[.floodfillloesung: | ||
+ | |||
+ | ===== Aufgabe 5: größter gemeinsamer Teiler ===== | ||
+ | <WRAP center round info 80%> | ||
+ | Sind $a, b \in \mathbb{N}$, | ||
+ | \\ $ ggT(a, b) = $ | ||
+ | * $a$, falls $a = b$, | ||
+ | * $ggT(b, a-b)$, falls $ a > b$ und | ||
+ | * $ggT(a, b - a)$, falls $a < b$. | ||
+ | |||
+ | Schreiben Sie eine Klasse '' | ||
+ | |||
+ | </ | ||
+ | [[.ggtLoesung: |
rekursion/start.1725802126.txt.gz · Zuletzt geändert: 2024/09/08 13:28 von Martin Pabst