4 Programmieren in Java III

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

Einstieg in die Informatik mit Java

Mathematische Rekursion

Speicher und Adressraum

Klassenvariablen, Klassenmethoden

Vorkurs Informatik WiSe 17/18

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

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

2. Algorithmische Methoden 2.1 Rekursion. 18. April 2017

Vorkurs Informatik WiSe 16/17

Folgen und Funktionen in der Mathematik

2. Programmierung in C

Programmieren I. Methoden-Spezial Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Grundlagen der Arithmetik und Zahlentheorie

Grundlagen der Programmierung

2. Programmierung in C

Informatik für Schüler, Foliensatz 18 Rekursion

3. Der größte gemeinsame Teiler

Einstieg in die Informatik mit Java

Konzepte der Programmiersprachen

7. Syntax: Grammatiken, EBNF

5. Der größte gemeinsame Teiler

Programmieren I. Methoden-Special Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

2 Teilbarkeit in Z. (a) Aus a b folgt a b und a b und a b und a b. (b) Aus a b und b c folgt a c.

Aufrufe von Objektmethoden

3. Diskrete Mathematik

Einführung in die Informatik I

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2017/18. Vorbereitende Aufgaben

Einführung in die Informatik I

Vorlesung Programmieren

Der Euklidische Algorithmus

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2016/17. Vorbereitende Aufgaben

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

Einführung in die Informatik I

Institut fu r Informatik

Hast du auch wirklich versucht, die Aufgaben einmal selbständig zu lösen? Wenn nicht, tue es, bevor du dir die Lösungen anschaust!

Methoden und Funktionen

Algorithmen und Datenstrukturen 1. EINLEITUNG. Algorithmen und Datenstrukturen - Ma5hias Thimm 1

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Informatik B von Adrian Neumann

Elementare Konzepte von

Student: Alexander Carls Matrikelnummer: Aufgabe: Beschreibung des euklidischen Algorithmus Datum:

Algorithmen implementieren. Implementieren von Algorithmen

Chr.Nelius: Zahlentheorie (WS 2006/07) ggt und kgv

2. Unterprogramme und Methoden

10. Teilbarkeit in Ringen

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

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

JAVA - Rekursion

Komplexität von Algorithmen

Wiederholung Diese Fragen sollten Sie ohne Skript beantworten können: Wo liegt der Unterschied zwischen dem 1. und 2. Binom? Wie nutzt man das 1./2. B

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

Einstieg in die Informatik mit Java

4.4 Imperative Algorithmen Prozeduren

Erweiterter Euklidischer Algorithmus

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

2. Programmierung in C

Vorkurs Informatik 2011

Rekursive Funktionen (1)

Informatik II Übung, Woche 14

Einstieg in die Informatik mit Java

2 Eine einfache Programmiersprache

Einführung in das Programmieren Probeklausur Lösungen

2 Eine einfache Programmiersprache

Felder - Arrays. Typ feldname[] = new Typ[<ganze Zahl >]; Beispiel: double vektor[] = new double[5]; auch eine Initialisierung ist möglich.

Aufgabenblatt: Methoden - rekursiv

Einführung in die Algebra

Algorithmen und Programmierung

Übung Praktische Informatik I

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

Informatik II. Woche 15, Giuseppe Accaputo

Aufgabe 1 (12 Punkte)

JAVA - Methoden - Rekursion

WS 2008/09. Diskrete Strukturen

Einführung in die Informatik 1

Schwerpunkte. 10. Felder (Arrays) Grundprinzip von Arrays. Klassifikation von Typen in Programmiersprachen

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

Prof. Dr. Heinrich Müller; Dr. Frank Weichert 7. September 2015

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

Vorlesung Programmieren

Einstieg in die Informatik mit Java

Die Menge C der komplexen Zahlen wird im Kapitel Weitere Themen behandelt.

Bsp. Euklidischer Algorithmus

Inhalt. 4.7 Funktionen

4. ggt und kgv. Chr.Nelius: Zahlentheorie (SS 2007) 9

Einstieg in die Informatik mit Java

Programmieren in Java

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

Selbststudium OOP6 & ALG Programmieren 1 - H1103 Felix Rohrer

Themen der Übung. Methoden und Wrapperklassen. Vorteile von Methoden. Methoden. Grundlagen

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

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration

Form der Äquivalenzklassen

Langzahlarithmetik implementieren Ac 1990 bis 2016

JAVA - Methoden

Einführung in die Programmierung Wintersemester 2010/11

Transkript:

1 4 Programmieren in Java III 4.1 Rekursive Funktionen und Prozeduren Ein Unterprogramm kann sich selbst aufrufen. Dabei sind, in einer korrekt entworfenen Programmiersprache, die lokalen Variablen der verschiedenen Aufrufebenen strikt voneinander getrennt. Um einen unendlichen Abstieg zu vermeiden, muss sorgfältig auf Abbruchbedingungen geachtet werden. Beispiel Fakultät: F (n) = n! (s. Übung) 1 für n = 0, F (n) = n F (n 1) für n > 0. Doppelfakultät: D(n) = n!! D(n) = 1 für n = 0, 1, n D(n 2) für n > 1. Anwendung Approximation von π durch das Wallis-Produkt π 2 = 2n 2n 1 2n 2n + 1 D(2n) 2 1 D(2n 1) 2n + 1 n=1 = lim n = 2 1 2 3 4 3 4 5 6 5 6 7 4.2 Größter gemeinsamer Teiler euklidischer Algorithmus Definition: Seien a,b Z ganze Zahlen. Die Zahl d = ggt(a,b) ist dann der größte gemeinsame Teiler von a und b, wenn gilt

4.2 Größter gemeinsamer Teiler euklidischer Algorithmus 2 i) d ist Teiler, d a und d b, und ii) es gibt keinen größeren Teiler, jeder weitere gemeinsamen Teiler teilt auch d, d.h. für c Z mit c a und c b gilt schon c d. Lemma: Es gilt ggt(a,b) = ggt(a b,b). Jeder gemeinsame Teiler von a und b teilt auch a b, und jeder gemeinsame Teiler von a b und b teilt auch (a b) + b = a. Folgerung: Es gilt ggt(a,b) = ggt(a q b,b), und es gibt Faktoren q Z mit b < a q b < b. Einfache Rekursion zur Bestimmung des größten gemeinsamen Teilers ggt( a, b ), a wenn b = 0, ggt(a,b) = ggt(b,a ) wenn b > a, ggt(a b,b) sonst. s t a t i c i n t ggt ( i n t a, i n t b ){ System. out. p r i n t l n ( "ggt (\ t "+a+",\ t "+b+"\ t ) " ) ; i f ( a<0) a= a ; i f ( b<0) b= b ; i f ( b==0) return a ; i f ( b>a ) return ggt ( b, a ) ; return ggt ( a b, b ) ; Produziert die Liste von Aufrufen: ggt( 37, 23 ) ggt( 14, 23 ) ggt( 23, 14 ) ggt( 9, 14 ) ggt( 14, 9 ) ggt( 5, 9 ) ggt( 9, 5 ) ggt( 4, 5 )

4.3 Lindenmayer Systeme 3 ggt( 5, 4 ) ggt( 1, 4 ) ggt( 4, 1 ) ggt( 3, 1 ) ggt( 2, 1 ) ggt( 1, 1 ) ggt( 0, 1 ) ggt( 1, 0 ) Es gibt viele Wiederholungen an der zweiten Stelle, d.h. dasselbe b wird mehrfach abgezogen. Durch Benutzung von Division mit Rest s t a t i c i n t ggt ( i n t a, i n t b ){ System. out. p r i n t l n ( "ggt (\ t "+a+",\ t "+b+"\ t ) " ) ; i f ( a<0) a= a ; i f ( b<0) b= b ; i f ( b==0) return a ; i n t q = a/b ; return ggt ( b, a q b ) ; ergibt sich die kondensierte Aufrufliste ggt( 37, 23 ) ggt( 23, 14 ) ggt( 14, 9 ) ggt( 9, 5 ) ggt( 5, 4 ) ggt( 4, 1 ) ggt( 1, 0 ) 4.3 Lindenmayer Systeme nach Aristide Lindenmayer (1925 1989) Ein L-System ist ein Termersetzungssystem. Es besteht aus einem Alphabet oder Zeichenvorrat Z, der wiederum in Variable V und Konstante K aufgeteilt ist. Aus den Zeichen können beliebige Worte gebildet werden. Ein solches Wort wird als Startwort S vermerkt. Die Dynamik eines L-Systems wird durch die Ersetzungsregeln R definiert. Dabei wird jeder Variablen ein Wort zugewiesen.

4.3 Lindenmayer Systeme 4 Die Entwicklung eines L-Systems erfolgt in Generationswechseln. Jede Generation ist ein Wort. Die erste Generation ist das Startwort S. Bei einem Generationswechsel werden im aktuellen Wort alle Variablen durch die Zeichenkette ihrer Ersetzungsregel ersetzt. Konstante Zeichen werden einfach kopiert. Beispiel: Wachstum von Fadenalgen. V: A,B, K: (leer), S: A R: A -> AB, B -> A Die ersten Generationen 1: A 1 Zeichen 2: AB 2 Zeichen 3: AB A 3 Zeichen 4: AB A AB 5 Zeichen 5: AB A AB AB A 8 Zeichen 6: AB A AB AB A AB A AB 13 Zeichen Die Zeichenanzahl entwickelt sich entsprechend der Fibonacci-Folge. A kann als erwachsene Alge, B als Knospe bzw. die Kombination AB als sich teilende Zelle interpretiert werden. V: F, K: +,-, S: F R: F->+F--F+ Die ersten Generationen 1: F 2: +F--F+ 3: +[+F--F+]--[+F--F+]+ 4: ++[+F--F+]--[+F--F+]+--+[+F--F+]--[+F--F+]++ Das Wort einer Generation kann als Folge von Steuerungsanweisungen für einen Roboter interpretiert werden. Z.B. eine Zeichenturtle (Stiftplotter). Hier ergibt F: einen Schritt vorwärts (forward), +: Drehen nach links (left) und -: Drehen nach rechts (right), jeweils um 45 o, ein interessantes Muster. Schrittweite und Winkel kann variiert werden.

4.3 Lindenmayer Systeme 5 Dabei bietet es sich an, die Variablen Zeichen als rekursive Prozeduren zu realisieren. Auf der Tiefe des Steuerwortes führen sie dann den Zeichenbefehl aus, in geringeren Tiefen wird das Ersetzungswort aufgerufen. / + / s t a t i c void P( ) { a r i. l e f t ( a n g l e ) ; / / s t a t i c void M( ) { a r i. r i g h t ( a n g l e ) ; / F / s t a t i c void F ( ) { l e v e l ++; i f ( l e v e l==depth ){ a r i. f o r w a r d ( s t e p ) ; e l s e { P ( ) ; F ( ) ;M( ) ;M( ) ; F ( ) ; P ( ) ; l e v e l ; V: F, K: +,, S: F R: F -> F+F--F+F mit Winkel 60 ergibt die Koch-Kurve V: F, K: +,, S: F R : F -> F+F F F+F mit Winkel 90 ergibt eine Variante der Koch-Kurve V: R, L, K: +, -, S: R R: R -> +R--L+, L -> -R++Lmit Winkel 45 ergibt das Drachenfraktal. Alternativ dazu mit kürzeren Regeln V: R, L, K: F, +,, S: FR R: R -> R+LF, L -> FR-L Winkel 90, R und L werden nicht als Zeichenbefehl interpretiert. import ch. a p l u. t u r t l e. T u r t l e ; java/lsystem_dragon.java public c l a s s LSystem_Dragon / A r i s t i d e Lindenmayer / { s t a t i c T u r t l e a r i ; s t a t i c double s i z e, step, a n g l e ; s t a t i c i n t depth, l e v e l ; s t a t i c void i n i t ( i n t dep ){ a r i = new T u r t l e ( ) ; s i z e = 120; a n g l e = 9 0 ;

4.3 Lindenmayer Systeme 6 depth = dep ; l e v e l =0; s t e p = 2.4 s i z e /Math. pow ( 2. 0, depth / 2. 0 ) ; i f ( depth >4) a r i. h i d e T u r t l e ( ) ; a r i. s etpos ( 0.8 s i z e, 0 ) ; a r i. r i g h t (45 ( depth +1)); s t a t i c void P( ) { a r i. l e f t ( a n g l e ) ; s t a t i c void M( ) { a r i. r i g h t ( a n g l e ) ; s t a t i c void F ( ) { a r i. f o r w a r d ( s t e p ) ; s t a t i c void R( ) { l e v e l ++; i f ( l e v e l <depth ){ / R+LF / R ( ) ; P ( ) ; L ( ) ; F ( ) ; l e v e l ; s t a t i c void L ( ) { l e v e l ++; i f ( l e v e l <depth ){ / FR L / F ( ) ; R ( ) ;M( ) ; L ( ) ; l e v e l ; s t a t i c void run ( ) { F ( ) ; R ( ) ; public s t a t i c void main ( S t r i n g [ ] a r g s ) { i n i t ( ( a r g s. l e n g t h >0)? I n t e g e r. p a r s e I n t ( a r g s [ 0 ] ) : 4 ) ; run ( ) ;