Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:algorithmen:rekursion:uebungen01:start [13.01.2022 12:22] – sbel | faecher:informatik:oberstufe:algorithmen:rekursion:uebungen01:start [29.01.2024 07:01] (aktuell) – Marco Kuemmel | ||
---|---|---|---|
Zeile 5: | Zeile 5: | ||
=== (A1) Potenzberechnung === | === (A1) Potenzberechnung === | ||
- | Implementiere | + | Implementiere |
- | Dezimalzahl '' | + | Dezimalzahl '' |
- | // | + | // |
+ | |||
+ | ++++ Hinweis 1 | | ||
+ | Beginne mit einem Methodengerüst, | ||
+ | |||
+ | Was ist der Basisfall - also wann weißt du sofort, was die Potenz ist, ohne zu überlegen (unabhängig von der Basis, betrachte den Exponenten). | ||
+ | ++++ | ||
+ | |||
+ | ++++ Hinweis 2: Pseudocode| | ||
+ | < | ||
+ | potenz(double basis, int exponent): | ||
+ | wenn exponent ist gleich 0: | ||
+ | | ||
+ | sonst | ||
+ | | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | ++++ Hinweis 3: Methodengerüst mit Basisfall| | ||
+ | <code java> | ||
+ | public double potenz(double b, int e) | ||
+ | { | ||
+ | if(e==0) { | ||
+ | return 1; | ||
+ | } else { | ||
+ | // Rekursionsfall ?? | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Was muss im Rekursionsfall berechnet werden? Welchen Aufrufparameter muss man beim rekursiven Aufruf der Methode verändern, damit der Basisfall irgendwann erreicht wird? | ||
+ | ++++ | ||
---- | ---- | ||
{{: | {{: | ||
=== (A2) Verzinsung === | === (A2) Verzinsung === | ||
- | Implementiereeine | + | Implementiere eine rekursive Methode '' |
eines Guthabens | eines Guthabens | ||
Jahren als Ergebnis das verzinste Guthaben nach Ende der Laufzeit zurückgibt. | Jahren als Ergebnis das verzinste Guthaben nach Ende der Laufzeit zurückgibt. | ||
- | // | + | // |
+ | ++++ Hinweis | | ||
+ | Das funktioniert genau wie Aufgabe 1, wenn man sich klar macht, dass das Guthaben nach a Jahren berechnet werden kann als: | ||
+ | G(g, | ||
+ | |||
+ | ++++ | ||
---- | ---- | ||
{{: | {{: | ||
=== (A3) Fibonacci-Zahlen === | === (A3) Fibonacci-Zahlen === | ||
- | Implementiere | + | Implementiere |
natürlichen | natürlichen | ||
zweite Fibonacci-Zahl ist jeweils 1. Die weiteren Fibonacci-Zahlen berechnen sich als | zweite Fibonacci-Zahl ist jeweils 1. Die weiteren Fibonacci-Zahlen berechnen sich als | ||
Zeile 31: | Zeile 67: | ||
2, 3, 5, 8, 13, 21, 34, 55'' | 2, 3, 5, 8, 13, 21, 34, 55'' | ||
- | // | + | // |
+ | |||
+ | ++++ Hinweis | | ||
+ | Das ist ein Beispiel, in dem sich die Funktion im Rekursionsfall mehr als einmal selbst aufruft. Es muss ja '' | ||
+ | |||
+ | Fange an wie immer: Fallunterscheidung, | ||
+ | |||
+ | ++++ | ||
+ | |||
+ | ++++ Methodengerüst | | ||
+ | <code java> | ||
+ | public int fibonacci(int n){ | ||
+ | // Bsisfall | ||
+ | if (n==1||n==2) { | ||
+ | return FIXME | ||
+ | } else { | ||
+ | return FIXME | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | ++++ | ||
---- | ---- | ||
{{: | {{: | ||
Zeile 37: | Zeile 94: | ||
Palindrome sind Wörter wie OTTO oder RELIEFPFEILER, | Palindrome sind Wörter wie OTTO oder RELIEFPFEILER, | ||
- | gelesen gleich sind. Implementiere eine rekursive Methode '' | + | gelesen gleich sind. Implementiere eine rekursive Methode '' |
rechten Feldgrenze '' | rechten Feldgrenze '' | ||
- | // | + | |
- | Beispiel:// Der Aufruf '' | + | === Beispiele: === |
+ | |||
+ | * Der Aufruf '' | ||
+ | * '' | ||
+ | |||
+ | === Hinweise & Tipps === | ||
+ | |||
+ | Einen String kann man sich in Java als Array von Char-Werten vorstellen. Auf einzelne Buchstaben kann man mit der Methode '' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Die Länge des Strings kann man mit '' | ||
+ | |||
+ | === Tipp 1: Basisfall === | ||
+ | |||
+ | Überlege dir zunächst, wann der Basisfall eintritt: Für welche Worte kannst du sofort ohne nachdenken sagen, dass Sie ein Palindrom sind? Wie hängt diese Eigenschaft mit den Parametern '' | ||
+ | |||
+ | === Tipp 2: Rekursionsfall === | ||
+ | |||
+ | Anders als bei den bisherigen Beispielen muss sich die Methode nicht unbedingt wieder selbst aufrufen, sondern nur dann, wenn das Wort nach dem bisherigen Kenntnisstand ein Palindrom sein könnte. Welche Bedingung muss erfüllt sein, damit es sich lohnt, das Wort weiter zu untersuchen? | ||
+ | |||
+ | ++++ Hinweis: Codegerüst | | ||
+ | |||
+ | <code java> | ||
+ | public boolean palindrom(String word, int start, int end) | ||
+ | { | ||
+ | // Basisfall | ||
+ | if (FIXME) { | ||
+ | return FIXME; | ||
+ | } | ||
+ | // Rekursionsfall | ||
+ | if (FIXME) { | ||
+ | // Was muss hier alles geschehen? | ||
+ | } | ||
+ | // Kein Palindrom | ||
+ | return false; | ||
+ | } | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | ++++ Lösungsvorschlag 1 | | ||
+ | |||
+ | <code java> | ||
+ | public boolean palindrom(String word, int start, int end) | ||
+ | { | ||
+ | // Basisfall | ||
+ | if (end-start< | ||
+ | return true; | ||
+ | } | ||
+ | // Rekursionsfall | ||
+ | if (word.charAt(start) == word.charAt(end)) { | ||
+ | start=start+1; | ||
+ | end=end-1; | ||
+ | return palindrom(word, | ||
+ | } | ||
+ | // Kein Palindrom | ||
+ | return false; | ||
+ | } | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | ++++ Lösungsvorschlag 2 | | ||
+ | |||
+ | <code java> | ||
+ | public boolean palindrom(String word, int start, int end) { | ||
+ | |||
+ | // Basisfall | ||
+ | if (end - start <= 1) { | ||
+ | return word.charAt(start) == word.charAt(end); | ||
+ | } | ||
+ | // Rekursionsfall | ||
+ | else { | ||
+ | start = start + 1; | ||
+ | end = end - 1; | ||
+ | return palindrom(word, | ||
+ | } | ||
+ | </ | ||
+ | ++++ |