Algorithmen & Programmierung. Rekursive Funktionen (1)

Ähnliche Dokumente
Speicher und Adressraum

Rekursive Funktionen (1)

Rekursive Funktionen (1)

Lösungsvorschlag Serie 2 Rekursion

Kapitel 7: Rekursion. Inhalt. Rekursion: Technik Rekursion vs. Iteration

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

1. Die rekursive Datenstruktur Liste

Algorithmen & Programmierung. Rekursive Funktionen (2)

Einführung in die Informatik I

Algorithmen und Datenstrukturen"

Programmieren 1 C Überblick

Algorithmen und Datenstrukturen"

Mathematische Rekursion

C++ Teil 4. Sven Groß. 30. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 16

Einführung in die Programmierung

Vorkurs Informatik WiSe 17/18

4 Programmieren in Java III

Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion. Programmieren in C

Grundlagen der Programmierung

Übungskomplex Reelle Zahlen. Rechnen mit Gleitkommazahlen

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Einführung in die Informatik I

2. Algorithmenbegriff

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 7. Entrekursivierung

Einstieg in die Informatik mit Java

Grundlagen der Informatik

Datenstrukturen und Algorithmen

15. Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Aufrufstapel, Bau eines Taschenrechners, BNF, Parsen

Institut für Programmierung und Reaktive Systeme 25. Januar Programmieren I. Übungsklausur

Rekursion. Sie wissen wie man Programme rekursiv entwickelt. Sie kennen typische Beispiele von rekursiven Algorithmen

4 Rekursionen. 4.1 Erstes Beispiel

2. Programmierung in C

Praktikum Ingenieurinformatik. Termin 4. Funktionen, numerische Integration

Erste Java-Programme (Scopes und Rekursion)

FHZ. K13 Rekursion. Lernziele. Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren. Inhalt

Vorkurs Informatik WiSe 16/17

Fakultät Angewandte Informatik Lehrprofessur für Informatik Übungen zur Vorlesung Informatik I, Blatt 2 - Musterlösung

Informatik für Schüler, Foliensatz 18 Rekursion

Institut für Programmierung und Reaktive Systeme 2. Februar Programmieren I. Übungsklausur

( )= c+t(n-1) n>1. Stand der Vorlesung Komplexität von Algorithmen (Kapitel 3)

Stack. Seniorenseminar Michael Pohlig

C++ Teil 5. Sven Groß. 16. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

Übungspaket 22 Rekursive Funktionsaufrufe

Stand der Vorlesung Komplexität von Algorithmen (Kapitel 3)

Übung zur Vorlesung Berechenbarkeit und Komplexität

Rekursive Funktionen

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

EWS, WS 2016/17 Pfahler I-1

Einführung in die Programmierung Wintersemester 2008/09

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Folgen und Funktionen in der Mathematik

Übung zur Vorlesung EidP (WS 2018/19) Blatt 4

Listen. M. Jakob. Gymnasium Pegnitz. 20. September Hinführung: Wartenschlangen. Grundprinzip von Listen Rekursion

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit ** i=1

Klassenvariablen, Klassenmethoden

public class Test extends MiniJava { public static void main (String [] args) { write(args[0]+args[1]); } } // end of class Test

Funktionen. mehrfach benötigte Programmteile nur einmal zu schreiben und mehrfach aufzurufen

Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Rekursion vs. Iteration, Sortieren

public static void main(string[] args) {

Klausur "ADP" SS 2015

Rekursive Funktionen und ihre programmtechnische Umsetzung

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

Listen. M. Jakob. 20. September Gymnasium Pegnitz

Wie entwerfe ich ein Programm?

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Algorithmen und Datenstrukturen 1 VL Übungstest WS Januar 2011

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Einleitung Grundlagen Erweiterte Grundlagen Zusammenfassung Literatur. C: Funktionen. Philip Gawehn

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Algorithmen & Programmierung. Steuerstrukturen im Detail Selektion und Iteration

Einschub: Anweisungen und Bedingungen für PAP und Struktogramme (1)

11. Rekursion. 1, falls n 1. n (n 1)!, andernfalls. Mathematische Rekursion. Rekursion in Java: Genauso! Unendliche Rekursion. n!

Vorlesung Programmieren

Software Entwicklung 1

Einstieg in die Informatik mit Java

Transkript:

Algorithmen & Programmierung Rekursive Funktionen (1)

Berechnung der Fakultät Fakultät Die Fakultät N! einer nichtnegativen ganzen Zahl N kann folgendermaßen definiert werden: d.h. zur Berechnung werden alle Zahlen von 1 bis N miteinander multipliziert: 1 2 3... N Fakultätsberechnung in C int fak_iterativ(int N) { int fk = 1; // = Fakultät von 0 und Fakultät von 1 for (int i = 2; i <= N; i++) fk = fk * i; return fk; } 461

Berechnung der Fakultät Alternative Die Fakultät kann auch wie folgt definiert werden: d.h. zur Bestimmung der Fakultät wird wiederum die Fakultät benötigt. Rekursion Der Begriff Rekursion bezeichnet die Definition einer Funktion durch sich selbst. Konsequenz für rekursive Algorithmen Damit ein rekursiver Algorithmus terminieren kann, muss es eine Abbruchbedingung für die Rekursion geben und damit diese eintreten kann, müssen der bzw. die Funktionsparameter bei jedem rekursiven Funktionsaufruf geändert werden. Eine unendliche Wiederholung eines rekursiven Algorithmus ist praktisch unmöglich. 462

Abarbeitung rekursiver Funktionen Funktionswert Jeder (rekursive) Funktionsaufruf berechnet (irgendwann) einen individuellen Funktionswert, der von den jeweils gültigen Parametern bzw. Variablenwerten zum Aufrufzeitpunkt abhängt. Rekursiver Abstieg Zunächst bewirkt ein rekursiver Funktionsaufruf allerdings solange weitere rekursive Funktionsaufrufe (mit jeweils neuen Parametern) bis die Abbruchbedingung erreicht ist. 463

Abarbeitung rekursiver Funktionen Rekursiver Aufstieg Ein konkretes Funktionsergebnis wird zum ersten Mal bei Erreichen des Abbruchkriteriums berechnet und zurückgegeben. Mit Hilfe dieses Funktionswerts wird nun im Rahmen des vorletzten rekursiven Funktionsaufrufs ein konkreter Funktionswert berechnet und an den drittletzten Funktionsaufruf weitergereicht usw. Konsequenz Für jeden Funktionsaufruf müssen alle Funktionsvariablen und Parameter gespeichert werden! 464

Abarbeitung rekursiver Funktionen Stack Bei jedem Funktionsaufruf (egal ob rekursiv oder nicht) werden alle Variablen und Parameter einer Funktion sowie die Rücksprungadresse und weitere Verwaltungsinformationen in einer Datenstruktur namens Stack (Stapel) abgelegt, die durch das Laufzeitsystem verwaltet wird. Details in Vorlesung Datenstrukturen Nach der vollständigen Durchführung einer Funktion wird der zu dieser Funktion korrespondierende Teil des Stacks wieder gelöscht und ggf. nur das Funktionsergebnis auf dem Stack abgelegt, um es einer aufrufenden Funktion zur Verfügung stellen zu können. 465

Abarbeitung rekursiver Funktionen Rekursive Funktionen Ruft sich eine Funktion selbst auf, werden für jeden Aufruf die entsprechenden Funktionsparameter auf dem Stack abgelegt, der deshalb proportional zur Rekursionstiefe wächst. (Deshalb sind unendliche Rekursionstiefen unmöglich) Nach dem Erreichen der Abbruchbedingung werden die Berechnungen der Funktionsrümpfe in der umgekehrten Reihenfolge ihres Aufrufs zu Ende gebracht und die entsprechenden Teile des Stacks gelöscht, der dadurch wieder schrumpft. 466

Abarbeitung rekursiver Funktionen int f(int N) { if (N == 0) return 1; } return N * f(n - 1); int main() { int v = 0; v = f(5); printf("5! ist %d", v); } return 0; 467

5 4 3 2 1 Abstieg der Rekursion - Stack wächst 0 468

120 24 6 2 1 1 Aufstieg der Rekursion - Stack schrumpft 469

Formulierung rekursiver Algorithmen Rekursion als Problemlösungsstrategie Ein Algorithmus zur Lösung eines Problems muss so formuliert werden, dass die (mehrfache) Selbstanwendung des Algorithmus auf seine Ergebnisse die Lösung des Problems liefern kann. Dazu formuliert man in der Regel eine Menge elementarer Operationen, die in jedem Rekursionsschritt mit genau einem Element der Problemdatenmenge ausgeführt werden können. Anschließend wird die Problemdatenmenge verkleinert und der Algorithmus auf der verkleinerten Problemdatenmenge wieder angewendet, bis die Lösung des Problems gefunden wurde. Definition eines Abbruchkriteriums Meist wird bei der Verkleinerung der Problemdatenmenge irgendwann ein besonderer Zustand (Abbruchkriterium) erreicht, z.b. beim Erreichen einer leeren Problemdatenmenge. Jeder Rekursionsschritt muss Bestandteile des Abbruchkriteriums modifizieren, so dass dieses erreicht werden kann. 470

Formulierung rekursiver Algorithmen Beispiel 1 Addition aller Elemente eines Feldes Iterative Lösung Die Summe aller Feldelemente lässt sich durch Iteration über alle Feldelemente bei gleichzeitiger Addition des jeweils aktuellen Feldelements zu einer Summenvariablen bestimmen. Rekursive Lösung Die Summe aller Elemente eines Feldes lässt sich durch Addition des ersten Feldelements mit der Summe des Restfeldes bestimmen. Abbruchkriterium Das Restfeld enthält nur noch ein Element. 471

Formulierung rekursiver Algorithmen Beispiel 2 Einlesen einer Zeichenfolge von der Tastatur und Ausgabe in umgekehrter Reihenfolge Iterative Lösung Bereitstellen eines ausreichend großen Feldes Solange gelesenes Zeichen c ungleich '\n' lege c im Feld ab Iteriere vom letzten zum ersten Feldelement mit Ausgabe des jeweiligen Feldelements Rekursive Lösung Lies Zeichen c ein und rufe Funktion wieder auf Gib c nach dem rekursiven Funktionaufruf aus Abbruchkriterium: c == '\n' 472

Formulierung rekursiver Algorithmen Beispiel 2 Einlesen einer Zeichenfolge von der Tastatur und Ausgabe in umgekehrter Reihenfolge Vergleich der Varianten Offene Frage bei der iterativen Variante Wie stellen wir ein ausreichend großes Feld bereit? Rekursion bietet eine implizite dynamische Speichermöglichkeit für nahezu beliebig viele Werte. Felder stellen eine explizite Speichermöglichkeit mit im Vorhinein bekannter Elementanzahl dar. Theoretisch bräuchten wir zur (iterativen) Lösung der Aufgabe ein dynamisches Feld, dessen Elementanzahl in Abhängigkeit von der gelesenen Zeichenanzahl schrumpfen und wachsen kann Vorlesung Datenstrukturen Rekursion realisiert dynamische Größe Rekursiver Algorithmus ist zudem kürzer 473

Formulierung rekursiver Algorithmen Beispiel 3 Ausgabe einer Dezimalzahl als Dualzahl Iterative Lösung benötigt Feld zum Ablegen der Binärziffern, da die Berechnung umgekehrt erfolgt Größe des benötigten Feldes lässt im Vorhinein bestimmen Algorithmus siehe Übung Rekursive Lösung Rufe Funktion rekursiv mit halbiertem Argument auf Gib Rest der Division des Arguments durch 2 aus Abbruchkriterium: Argument 1 474

Ende der Vorlesung