Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
faecher:informatik:oberstufe:algorithmen:rekursion:rekursionsschachteln:start [13.01.2022 08:43] – [Fallunterscheidung ist unbedingt notwendig] sbel | faecher:informatik:oberstufe:algorithmen:rekursion:rekursionsschachteln:start [Unbekanntes Datum] (aktuell) – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Rekursive Schachtelsuche ====== | ||
- | |||
- | Die rekursive Denkweise macht sich zunutze, dass wir für jede Schachtel, wie wir finden, dasselbe tun müssen: | ||
- | |||
- | * Aufmachen. | ||
- | * Wenn ein Schlüssel drin ist: Freuen! | ||
- | * Wenn eine Schachtel drin ist: Das was wir mit jeder Schachtel machen... | ||
- | |||
- | {{ : | ||
- | |||
- | < | ||
- | funktion suche_schluessel(schachtel): | ||
- | für jeden gegenstand in schachtel: | ||
- | wenn gegenstand.istSchachtel(): | ||
- | suche_schluessel(gegenstand) | ||
- | sonst wenn gegenstand.istSchlüssel: | ||
- | ausgeben " | ||
- | </ | ||
- | |||
- | Bei der Betrachtung des Pseudocodes fällt auf, dass sich die Funktion '' | ||
- | |||
- | <WRAP center round tip 60%> | ||
- | Wenn eine Funktion sich selbst aufruft spricht man von **Rekursion**. | ||
- | </ | ||
- | |||
- | //Ein Wort Eleganz und Performanz:// | ||
- | |||
- | < | ||
- | Loops may achieve a performance gain for your program. Recursion may achieve a performance gain for your programmer. Choose which is more important in your situation! | ||
- | </ | ||
- | (Leigh Caldwell, http:// | ||
- | |||
- | ===== Fallunterscheidung ist unbedingt notwendig ===== | ||
- | |||
- | Die Funktion ruft sich aber nicht bedingungslos selbst auf, sondern nur dann, wenn eine Schachtel (und kein Schlüssel) gefunden wird. Wenn man diese Fallunterscheidung weglässt, erzeugt man eine " | ||
- | |||
- | ---- | ||
- | {{: | ||
- | === (A1) Experiment: Countdown === | ||
- | |||
- | Implementiere eine Methode, die einen Countdown ausgibt: | ||
- | |||
- | < | ||
- | 4 ..... 3 ..... 2 ..... 1 ..... 0 | ||
- | </ | ||
- | |||
- | **(A)** Zunächst iterativ, z.B. mit einer for-Schleife, | ||
- | |||
- | **(B)** Dann rekursiv anhand des folgenden Pseudocodes: | ||
- | |||
- | < | ||
- | countdown_rekursiv(int i): | ||
- | print(i + " .... ") | ||
- | countdown_rekursiv(i-1) | ||
- | </ | ||
- | |||
- | Teste den Code. Was beobachtest du? Erläutere, was das Problem ist - kannst du es lösen? | ||
- | |||
- | <WRAP center round important 60%> | ||
- | Jede rekursive Funktion benötigt eine Fallunterscheidung in zwei Fälle: | ||
- | * **Rekursionsfall**: | ||
- | * **Basisfall**: | ||
- | </ | ||
- | |||
- | **(C)** Passe deine rekursive Methode anhand des folgenden Pseudocodes: | ||
- | |||
- | < | ||
- | countdown_rekursiv(int i): | ||
- | wenn i<=0: | ||
- | return | ||
- | sonst: | ||
- | print(i + " .... ") | ||
- | countdown_rekursiv(i-1) | ||
- | </ | ||