Einführung in die Programmierung I. 5. Prozeduren. Stefan Zimmer

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

II.3.1 Rekursive Algorithmen - 1 -

C.3 Funktionen und Prozeduren

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

Einführung in die Programmierung II. 1 Einleitung/Übersicht

Funktionen; Rekursion

Einführung in die Programmierung I. Funktionen, Rekursion. Stefan Zimmer

Software Entwicklung 1. Rekursion. Beispiel: Fibonacci-Folge I. Motivation. Annette Bieniusa / Arnd Poetzsch-Heffter

Einführung in die Programmierung I. 4. Kontrollstrukturen. Stefan Zimmer

2. Algorithmische Methoden 2.1 Rekursion. 18. April 2017

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Programmierkurs Python I

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

Rekursive Funktionen (1)

Grundlagen der Programmierung in C Funktionen

Rekursive Funktionen (1)

C-Grundlagen. zur Programmierung des MicroControllersystems MiCoWi

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

Präzedenz von Operatoren

C++ - Kontrollstrukturen Teil 2

Einführung in die Programmierung II. 3. Kontrollstrukturen

11. Rekursion, Komplexität von Algorithmen

n(n + 1)(2n + 1). 6 j 2 = Hinweis: Setze für n IN n(n + 1)(2n + 1) 6 A(n) : und wähle die Bezeichnung s n := n (2j + 1) = n2 (2j + 1) = (n + 1)2

JAVA - Rekursion

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

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

Elementare Konzepte von

Programmiersprachen und ihre Übersetzer

= =

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

Vorkurs Informatik WiSe 17/18

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

Einführung in die Programmierung II. 4. Funktionen

5. Übung - Kanalkodierung/Programmierung

Einführung in die Programmierung I. 10. Klassen und Objekte. Stefan Zimmer

Einführung in die Programmierung I. 8. Prozedurale Konzepte in Java, Teil1. Stefan Zimmer

Grundlagen der Programmierung

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

Induktion und Rekursion

Einstieg in die Informatik mit Java

Linux und Shell-Programmierung Teil 6

EWS, WS 2016/17 Pfahler I-1

Inhalt. 3. Spezielle Algorithmen

4 Rekursionen. 4.1 Erstes Beispiel

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

Induktion und Rekursion

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

Kompaktkurs Einführung in die Programmierung. 4. Kontrollstrukturen

Aufrufe von Objektmethoden

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

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

Funktionen in Python

2. Variablen, Kontrollstrukturen, Rekursion

12. Rekursion. 1, falls n 1. n (n 1)!, andernfalls. Lernziele. Mathematische Rekursion. Rekursion in Java: Genauso! n! =

Einstieg in die Informatik mit Java

Grundlagen der Programmierung (Vorlesung 15)

11. Rekursion. - Wiederholung von Anweisungen: durch Iteration und Rekursion - Anwendungsfälle der Rekursion

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

Vorlesung Programmieren

Einführung in die Programmierung für NF. Rückgabewerte, Fallunterscheidung, Schleifen

Vorkurs Informatik WiSe 16/17

1 pulsierender Speicher

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

Beispiele: Funktionsabstraktion (3) Funktionsdeklaration. Funktionsdeklaration (2) Funktionsdeklaration (3) 3. Abstraktion über Funktionsbezeichner:

Sortieren. Maple sortiert; Unordnung schaffen. > restart;

Java für Anfänger Teil 7: Methoden. Programmierkurs Manfred Jackel

Programmierkurs. Manfred Jackel

2. Unterprogramme und Methoden

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

Grundlagen der Programmierung (Vorlesung 14)

3 Funktionsdefinitionen

Teil II. Literatur zur C-Programmierung:

6. Unterprogramme 6-1

Rekursive Funktionen und ihre programmtechnische Umsetzung

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

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Software Entwicklung 1

3.2 Datentypen und Methoden

III.1 Prinzipien der funktionalen Programmierung - 1 -

Programmierkurs I. Gliederung: Deklarationsteil als BNF 2. Blöcke in Ada95 (Lebenszeit, Sichtbarkeit von Variablen)

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung

Inhalt. 3. Spezielle Algorithmen

12. Rekursion Grundlagen der Programmierung 1 (Java)

JAVA - Methoden - Rekursion

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

Informatik I (D-MAVT)

Krawatterätsel - Verbesserung der oberen Schranke

Krawattenrätsel - Verbesserung der oberen Schranke

Institut fu r Informatik

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

Einführung in die Programmierung II. 5. Zeiger

6. Funktionen, Parameterübergabe

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

Abschnitt 5. Grundlagen der funktionalen & imperativen Programmierung

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

11. Rekursion, Komplexität von Algorithmen

Rekursive Funktionen

Übung: Quicksort. Erster Schritt zu Quicksort: Felder "partitionieren"

Transkript:

Einführung in die Programmierung I 5. Prozeduren Stefan Zimmer 19.11.2007

Prozedurdeklaration mit proc Eine (mächtigere) Alternative zur Funktionsdeklaration mit -> besteht aus dem Wort proc einer Sequenz der Formalparameter in () ggf. der Deklaration lokaler und globaler Variablen (s.u.) ggf. weiteren Optionen einer Folge von Anweisungen dem Wörtern end proc Das ganze kann man wieder einem Namen zuweisen. 2

Prozeduraufruf Eine so deklarierte Prozedur wird genauso aufgerufen wie bisher: Prozedur(Aktualparameter) Die Anweisungen (das können jetzt z.b. auch Schleifen und Fallunterscheidungen sein) werden ausgeführt Bei Erreichen des end proc wird als Ergebnis das Ergebnis der letzten ausgeführten Anweisung zurückgegeben. Alternative: wenn eine Anweisung der Form return Sequenz von Ausdrücken erreicht wird, wird die Arbeit ebenfalls eingestellt und die Sequenz zurückgegeben 3

Lokale Variablen Prozeduren können eigene Variablen haben; diese heißen lokale Variablen Dazu schreibt man hinter der Angabe der formalen Parameter eine Deklaration der Form local Sequenz von Namen Diese Variablen entstehen beim Prozeduraufruf und verschwinden (in der Regel) bei Beenden der Prozedur (müssen wir uns nicht drum kümmern) Auf lokale Variablen kann man nur innerhalb der Prozedur zugreifen, in der sie definiert sind. 4

Globale Variablen Globale Variablen können von allen Prozeduren und von der Eingabeebene aus verwendet werden. Dazu deklariert man sie in der Prozedur als global Sequenz von Namen (Variablen der Eingabeebene sind immer global) Globale Variablen sollte man soweit möglich vermeiden Programme, die sie zu heftig verwenden, sind in der Regel schwer durchschaubar: der Regelfall sollte die Kommunikation über Parameter und Funktionsergebnisse sein. 5

Anmerkungen Noch zwei Dinge nicht zum Merken, sondern für den Fall, dass wir drüber stolpern (z.b., wenn Anweisungen im Innern einer Prozedur nicht das tun, was sie außerhalb getan haben): Für Namen, die in Prozeduren ohne Deklaration (local/global) verwendet werden, entscheidet Maple selber. Besser: immer deklarieren! Die Auswerteregeln (Ersetzung von Namen durch Objekte) sind in Prozeduren anders (es wird weniger weit ausgewertet, s. Worksheet) 6

Zuweisungen an Parameter Gelegentlich will man einer Prozedur eine Variable (deren Namen) übergeben, damit die Prozedur dieser Variablen etwas zuweisen kann. In Maple ist der Wunsch relativ selten, weil man problemlos eine Sequenz/Liste/Menge etc. von mehreren Dingen als Ergebnis haben kann, was das häufigste derartige Problem löst. Wenn man das doch machen will, muss man dafür sorgen, dass auch wirklich der Name übergeben wird und er nicht ausgewertet wird (z.b. mittels ' '). 7

Schleifen und Rekursion Da wir nun (rekursive) Prozeduren schreiben können, können wir den Zusammenhang zwischen Schleifen und Rekursion in Maple hinschreiben Eine for-schleife ist einfach eine bequeme Aufschreibung für folgende Art der Rekursion (primitive Rekursion genannt): proc Schleife(i) if i>0 then Schleife(i-1) end if; Tu_Was(i) end proc Dann entspricht Schleife(n) folgendem: for i from 0 to n do Tu_Was(i) end do 8

Türme von Hanoi Ein notorisches Beispiel für Rekursion fehlt uns noch, weil wir dazu Prozeduren brauchen: die Türme von Hanoi Drei Pfosten P1, P2, P3; auf P1 sind h Scheiben von paarweise verschiedenem Durchmesser aufgespießt der Größe nach (die größte liegt unten). Dieser Turm soll nun nach P3 transportiert werden Regeln folgen gleich P1 P2 P3 P1 P2 P3 9

Türme von Hanoi: Regeln Zwei Bedingungen gelten für den Scheibentransport: Es darf immer nur eine Scheibe auf einmal transportiert werden eine Scheibe darf nur abgelegt werden entweder als unterste Scheibe eines Pfostens oder auf eine größere Scheibe 10

Türme von Hanoi: Algorithmus Divide et impera! Wir teilen den Turm auf in die unterste Scheibe und den Rest. Den kleineren Turm auf dem freien Pfosten parken. (Rekursion!) Die unterste Scheibe transportieren. Den geparkten Turm hinterher. Die Rekursionsstruktur wird hier interessant, weil der Transport des Turms der Höhe h zwei Transporte von (h-1)-türmen erfordert. 11

Türme von Hanoi: Algorithmus (2) Die Rekursion bricht ab, weil für Türme der Höhe h=0 nichts zu tun ist. Die Rollen von Anfangs-, Zwischen- und Endpfosten wechseln (z.b. ist P2 das Ziel des ersten (h-1)-transfers). Dass wir auch wirklich die Stapelregeln einhalten, kann man sich bei Gelegenheit mal überlegen. 12

Mit zwei Prozeduren bewegeturm(a, Z, E, h) zum Bewegen eines Turms der Höhe h von A über Z nach E umlegescheibe(a, E) zum Bewegen einer Scheibe von A nach E ergibt sich für h=3 folgendes Spiel: bewegeturm(p1,p2,p3,3) bewegeturm(p1,p3,p2,2) umlegescheibe(p1,p3) bewegeturm(p2,p1,p3,2) umlegescheibe(p1,p2) umlegescheibe(p2,p3) bewegeturm(p1,p2,p3,1) bewegeturm(p3,p1,p2,1) bewegeturm(p2,p3,p1,1) bewegeturm(p1,p2,p3,1) umlegescheibe(p1,p3) umlegescheibe(p3,p2) umlegescheibe(p2,p1) umlegescheibe(p1,p3)

Aufrufstruktur (h=3) P1,P2,P3,3 P1,P3,P2,2 P2,P1,P3,2 P1,P2,P3,1 P3,P1,P2,1 P2,P3,P1,1 P1,P2,P3,1 P1,P3,P2,0 P2,P1,P3,0 P3,P2,P1,0 P1,P3,P2,0 P2,P1,P3,0 P3,P2,P1,0 P1,P3,P2,0 P2,P1,P3,0 Die Aufrufe von bewegeturm (einschließlich der mit h=0, die waren auf dem vorigen Bild weggelassen) Während des grün markierten Transports sind die gelben begonnen, aber noch nicht abgeschlossen Mehrere Inkarnationen der Prozedur existieren also gleichzeitig 14

Kosten Der Aufwand zum Bewegen eines Turms hängt offensichtlich (?) nur von dessen Höhe ab. Die Anzahl der Scheibenbewegungen dafür heiße A(h). Dann gilt A(0)=0 und A(h)=2A(h-1)+1 für h>0, was auf A(h)=2 h -1 führt. Die Zahl der Scheibenbewegungen wächst also exponentiell mit der Turmhöhe 15