Rekursive Funktionen (1)

Ähnliche Dokumente
Algorithmen & Programmierung. Rekursive Funktionen (1)

Vorkurs Informatik WiSe 17/18

Vorkurs Informatik WiSe 16/17

Informatik für Schüler, Foliensatz 18 Rekursion

Programmieren 1 C Überblick

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

Speicher und Adressraum

Speicherklassen (1) Lokale Variablen

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

Rekursive Funktionen sind Funktionen, die sich auf sich selbst beziehen bzw. Funktion, die sich selbst aufrufen.

C++ - Kontrollstrukturen Teil 2

Einstieg in die Informatik mit Java

Funktionale Programmierung. Funktionale Programmierung: Vorlesungsüberblick. Eigenschaften rein funktionaler Programmierung

Einführung in die Programmierung

Grundlagen der Programmierung

Programmierkurs Python I

6 Speicherorganisation

Funktionen in Matlab. Nutzerdefinierte Funktionen können in.m-datei gespeichert werden

4 Rekursionen. 4.1 Erstes Beispiel

Funktionen in PHP 1/7

Programmierung mit C Algorithmen

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 4

Lösungsvorschlag Serie 2 Rekursion

Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen

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

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

3. Basiskonzepte von Java

Institut für Informatik

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

JAVA - Methoden - Rekursion

Schnittstellen, Stack und Queue

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Grundlagen der Programmierung in C Funktionen

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

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

2. Programmierung in C

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015

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

Mathematische Rekursion

Einführung in die Programmiersprache C

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

Einführung in die Programmiersprache C

Algorithmen und Datenstrukturen"

6.5 Mehrdimensionale Felder

Algorithmen und Datenstrukturen"

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

Großübung zu Einführung in die Programmierung

JAVA - Rekursion

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

Einführung in die Informatik I

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

Algorithmen, Datenstrukturen und Programmieren II SS 2001

Induktion und Rekursion

Assembler Unterprogramme

AuD-Tafelübung T-B5b

Rekursion. Beispiel Fakultät (iterativ) Rekursive Java-Implementierung. Beispiel Fakultät (rekursiv) n! = n

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

4.2 Selbstdefinierte Matlab-Funktionen 1. Teil

Karlsruher Institut für Technologie

Datenstrukturen & Algorithmen

Beim rekursiven Aufruf einer Funktion wird jeweils ein Duplikat der gesamten Funktion im Speicher abgelegt.

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Einführung in die Programmierung II. 5. Zeiger

Probeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, Uhr Bearbeitungszeit: 105 Minuten

To know recursion, you must first know recursion. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel 17 1

Programmiertechnik Methoden, Teil 2

Folgen und Funktionen in der Mathematik

Arrays. Arrays werden verwendet, wenn viele Variablen benötigt werden. Der Vorteil in Arrays liegt darin, dass man nur eine Variable deklarieren muss

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

Felder, Zeiger und Adreßrechnung

public static void main(string[] args) {

Algorithmen und Datenstrukturen

Inhalt. 7 Rekursionen Eine unendliche Geschichte Fakultät Türme von Hanoi Dr.

Tutoraufgabe 1 (Sortieren): Lösung: Datenstrukturen und Algorithmen SS14 Lösung - Übung 4

Java: Eine kurze Einführung an Beispielen

Java Einführung Methoden. Kapitel 6

Teil 14: Rekursive Programmierung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

Vorlesung Skriptsprachen Duale Hochschule Stuttgart Sommersemester Dipl.-Ing. (FH) Volker Schepper

Rekursive Algorithmen

Hallo Welt für Fortgeschrittene

Vorlesung Programmieren

Rekursive Listenverarbeitung

4 Programmieren in Java III

Programmieren lernen mit Groovy Rekursion Rekursion und Iteration

Transkript:

Rekursive Funktionen (1) Rekursive Algorithmen Wenn Gesamtlösung durch Lösen gleichartiger Teilprobleme erzielbar: Rekursion möglich Beispiel: Fakultät einer ganzen Zahl n: n i n! = i=1 für n > 0 1 für n = 0 Produkt kann auch geschrieben werden als 1 2 3 n 1 n Aufgabe kann auch formuliert werden als: n n 1! für n > 0 n! = 1 für n = 0 Funktion heißt rekursiv, weil die Fakultät von n sich aus n multipliziert mit der Fakultät von n 1 ergibt Abbruchbedingung ist bei n = 0 mit dem Ergebnis 1

Rekursive Funktionen (2) Rekursive Algorithmen Für rekursive Funktionen gelten folgende Regeln Aufgaben werden in gleichartige Teilprobleme zerlegt Jede Rekursion trägt zur Gesamtlösung bei Für mindestens eine Kombination der Funktionsparameter muss die Rekursion beendet werden, was tatsächlich auftreten muss (ein Algorithmus muss terminieren) Bei der Realisierung rekursiver Algorithmen verlässt man sich darauf, dass alle rekursiven Aufrufe funktionieren Teilprobleme werden als gelöst betrachtet (z.b. (n 1)! ) n! = n n 1 gelöst Wichtig: Abbruchbedingung nicht vergessen

Rekursive Funktionen (3) Rekursive Funktionen werden wie normale Funktionen definiert Beispiel einer rekursiven Fakultätsfunktion: long Fakultaet(long n) { if (n == 0) // n ist nur hier sichtbar return 1; // Abbruchbedingung return n * Fakultaet(n - 1); // rekursiver Aufruf } // end Fakultaet Da der Funktionskopf dem Compiler die Funktion bereits bekannt macht, kann diese innerhalb der Funktion nochmals aufgerufen werden Es gelten die üblichen Sichtbarkeitsregeln, z.b. auto: nur innerhalb des Funktionsblocks Wert der Variablen wird im rekursiven Funktionsaufruf übergeben, es wird dann bei der aufgerufenen Funktion eine neue Variable mit dem gleichen Namen angelegt

Rekursive Funktionen () long Fakultaet(long n) { if (n == 0) // n ist nur hier sichtbar return 1; // Abbruchbedingung return n * Fakultaet(n - 1); // rekursiver Aufruf } // end Fakultaet Zunächst wird die Abbruchbedingung für n = 0 codiert Eigentliche Berechnung erfolgt mit n * Fakultaet(n - 1) Lokale Variablen werden auf dem Stack angelegt Bei jedem Aufruf der Funktion werden deshalb neue lokale Variablen oben auf den Stack gelegt und bei beenden der Funktion wieder entfernt Bei erneutem Aufruf der gleichen Funktion passiert das auch Variablen mit gleichem Namen, jedoch anderem Inhalt, da diese jetzt einen ganz anderen Speicherort hat Im Beispiel der Fakultätsfunktion wächst der Stapel, bis Abbruchbedingung erreicht, dann wird alles rückwärts abgearbeitet

Rekursive Funktionen (a) Beispiel eines Parameterstapels bei einer Rekursion mit!

Rekursive Funktionen (b) Beispiel eines Parameterstapels bei einer Rekursion mit!

Rekursive Funktionen (c) Beispiel eines Parameterstapels bei einer Rekursion mit! 3 n bei zweiter Rekursion

Rekursive Funktionen (d) Beispiel eines Parameterstapels bei einer Rekursion mit! 2 3 n bei dritter Rekursion n bei zweiter Rekursion

Rekursive Funktionen (e) Beispiel eines Parameterstapels bei einer Rekursion mit! 1 2 3 n bei vierter Rekursion n bei dritter Rekursion n bei zweiter Rekursion

Rekursive Funktionen (f) Beispiel eines Parameterstapels bei einer Rekursion mit! 0 1 2 3 n bei letzter Rekursion n bei vierter Rekursion n bei dritter Rekursion n bei zweiter Rekursion

Rekursive Funktionen (g) Beispiel eines Parameterstapels bei einer Rekursion mit! 0 1 2 3 n bei letzter Rekursion n bei vierter Rekursion n bei dritter Rekursion n bei zweiter Rekursion Rückgabewert 1 (Abbruchbedingung)

Rekursive Funktionen (h) Beispiel eines Parameterstapels bei einer Rekursion mit! 1 2 3 n bei vierter Rekursion Rückgabewert 1 n bei dritter Rekursion n bei zweiter Rekursion

Rekursive Funktionen (i) Beispiel eines Parameterstapels bei einer Rekursion mit! 2 3 n bei dritter Rekursion Rückgabewert 2 n bei zweiter Rekursion

Rekursive Funktionen (j) Beispiel eines Parameterstapels bei einer Rekursion mit! 3 n bei zweiter Rekursion Rückgabewert 6

Rekursive Funktionen (k) Beispiel eines Parameterstapels bei einer Rekursion mit! Rückgabewert 2

Rekursive Funktionen (l) Beispiel eines Parameterstapels bei einer Rekursion mit! Rückgabewert 120

Rekursive Funktionen (6) Die Variablen werden für jeden Rekursionsschritt neu erzeugt Der Stapel wird in umgekehrter Reihenfolge wieder abgebaut, d. h. die Variablen verschwinden in umgekehrter Reihenfolge wieder vom Stapel Jede Rekursion hat ihren eigenen Variablenset im Stapel trotz namensgleicher Variablen Darunter liegende Variablen sind nicht sichtbar Übergabe von Informationen erfolgt ausschließlich durch Aufrufparameter bzw. durch den Rückgabewert Ein realer Stapel (Programmstack) ist komplizierter: hier werden auch Parameter, Rückgabewerte und Rücksprungadressen gespeichert Das gezeigte Fakultätsbeispiel ist sinnvoller als Schleife zu programmieren (Geschwindigkeit) Rekursionen empfehlenswert, wenn diese einfacher zu beschreiben sind als Schleifen Beispiele: Quicksort, Traversieren von Bäumen Endlosrekursion Stapelüberlauf (stack overflow)