Fallstudie: Nim Spiel
|
|
|
- Insa Burgstaller
- vor 8 Jahren
- Abrufe
Transkript
1 Fallstudie: Nim Spiel Angeblich chinesischen Ursprungs (Jianshizi) Interessant für Spieltheorie: vollständig analysierbar Frühzeitig computerisiert 1939 Nimatron (Weltausstellung New York) 1951 Nimrod (Berliner Handelsmesse)
2 Das Nim Spiel Regeln Es gibt zwei Stapel von Münzen. Zu Beginn enthalten beide Stapel gleich viele Münzen. Die beiden Spieler ziehen abwechselnd. In einem Zug entfernt der Spieler beliebig viele Münzen von einem Stapel seiner Wahl. Es gewinnt der Spieler, der die letzte Münze aufnimmt. Aufgaben Erstelle Datenstrukturen für den Spielstand und für einen Zug. Erstelle eine Prozedur, die einen Zug ausführt.
3 3 Rekursion 3.1 Polymorphe Verträge Beobachtung: Manche Prozeduren arbeiten unabhängig von der Sorte ihrer Argumente, dh. sie verhalten sich polymorph (vom griechischen πoλυµoρϕoς, vielgestalt). Beispiele: ; Die Identität: Argument unverändert zurückgeben (: identity (%value -> %value)) (define identity (lambda (x) x)) ; Die konstante Funktion: Das erste Argument unverändert zurückgeben (: const (%value %value -> %value)) (define const (lambda (x y) x))
4 ; Projektion: ein Argument auswählen (: proj ((one-of 1 2) %value %value -> %value)) (define proj (lambda (i x1 x2) (cond ((= i 1) x1) ((= i 2) x2)))) Kennzeichen: der Vertrag der Prozeduren enthält Vertragsvariable, die jeden Wert akzeptieren
5 3.1.1 Parametrisch polymorphe Verträge Die Verträge mit %value sind unbefriedigend und ungenau! Betrachte (: identity (%value -> %value)) Aussage: wenn das Argument von identity irgendein Wert ist, so ist das Ergebnis auch irgendein (anderer) Wert. Aber: (identity 1) liefert number (identity "xyz") liefert string (identity #f) liefert boolean dh. identity angewendet auf Wert der Sorte A liefert einen Wert der Sorte A!
6 3.1.2 Beispiele für parametrisch polymorphe Verträge ; Die Identität: Argument unverändert zurückgeben (: identity (%a -> %a)) (define identity (lambda (x) x)) ; Die konstante Funktion: Das erste Argument unverändert zurückgeben (: const (%a %b -> %a)) (define const (lambda (x y) x)) ; Projektion: ein Argument auswählen (: proj ((one-of 1 2) %a %a -> %a)) (define proj (lambda (i x1 x2) (cond ((= i 1) x1) ((= i 2) x2))))
7 3.1.3 Schreibweise für parametrisch polymorphe Verträge Eine Prozedur, die einen Teil ihrer Argumente immer gleichartig behandelt, kann einen parametrisch polymorphen Vertrag erhalten. Der polymorphe Vertrag verwendet eine Sortenvariable (wie z.b. %a, %b,... ) um über eine konkrete Sorte zu abstrahieren. Der parametrisch polymorphe Vertrag fasst alle Verträge zusammen, wo Sorten konsistent für die Sortenvariablen eingesetzt werden. (Vertragsinstanzen) Beispiel: Wenn p den Vertrag (number %a %a -> %a) erfüllt, dann erfüllt p alle folgenden Verträge number number number -> number number string string -> string number boolean boolean -> boolean number cookie cookie -> cookie
8 3.1.4 Paare ; Ein Paar ist ein Wert ; (make-mypair a b) ; wobei a und b jeweils beliebige Werte sind. Die zugehörige Record-Definition (define-record-procedures mypair make-mypair mypair? (myfirst myrest)) liefert Prozeduren mit folgenden Verträgen (: make-mypair (%value %value -> mypair)) (: mypair? (%value -> boolean)) (: myfirst (mypair -> %value)) (: myrest (mypair -> %value))
9 3.1.5 Paare - verbessert ; Ein Paar von A und B ist ein Wert ; (make-mypair a b) ; wobei a und b jeweils Werte aus A bzw. B sind. Die zugehörige parametrische Record-Definition (define-record-procedures-parametric mypair mypair-of make-mypair mypair? (myfirst myrest)) liefert Prozeduren mit folgenden Verträgen (: make-mypair (%a %b -> (mypair-of %a %b))) (: mypair? (%value -> boolean)) (: myfirst ((mypair-of %a %b) -> %a)) (: myrest ((mypair-of %a %b) -> %b))
10 3.2 Listen Die leere Liste ; Leere Liste ; empty : empty Verwendung empty => #<empty-list> Das Typprädikat empty? (empty? empty) => #t (empty? "wasanderes") => #f
11 3.2.2 Listen aus Paaren und empty ; Eine Liste von As ist eins der folgenden ; - die leere Liste ; - ein Paar (aus einem A-Wert und einer Liste von As) ; Name: (mylist-of %a) d.h. eine (mylist-of %a) verwendet make-mypair mit der Vertragsinstanz (: make-mypair (%a (mylist-of %a) -> (mylist-of %a))) Beobachtung: Liste tritt in der Definition von Liste auf (innerhalb eines Paars). Liste ist ein rekursiver Datentyp definiert durch eine rekursive Definition.
12 3.2.3 Vertragdefinition für Listen Standardvertrag ohne Parameter (define mylist (mixed (predicate empty?) mypair)) Liste von A ist ein gemischter Datentyp. Der Vertrag für (mylist %a) ist parametrisch, daher muss er durch eine Lambda-Abstraktion definiert werden! (define mylist-of (lambda (elem-contract) (contract (mixed (predicate empty?) (mypair-of elem-contract (mylist-of elem-contract))))))
13 3.2.4 Vordefinierte Paare und Listen Ab Sprachlevel Die Macht der Abstraktion : ; Eine Liste von As ist eins der folgenden ; - die leere Liste ; - ein Paar (aus einem Wert und einer Liste von As) ; Name: (list %value) dabei verwenden wir folgende Vereinbarung ; Ein Paar ist ein Wert ; (make-pair x y) ; wobei x ein Wert aus A ist und y eine Liste von As. (: make-pair (%a (list %a) -> (list %a)))
14 3.2.5 Beispiele für Listen empty (make-pair 1 empty) (make-pair 1 (make-pair 2 empty)) (make-pair 1 (make-pair 2 (make-pair 3 empty))) Liefern die Ausgabe #<empty-list> #<record:pair 1 #<empty-list>> #<record:pair 1 #<record:pair 2 #<empty-list>>> #<record:pair 1 #<record:pair 2 #<record:pair 3 #<empty-list>>>> Die Sorten der Listenelemente müssen nicht gleich sein: (make-pair 1 (make-pair #t (make-pair "Ende" empty))) => #<record:pair 1 #<record:pair #t #<record:pair "Ende" #<empty-list>>>>
15 3.2.6 Visualisierung Die Liste (make-pair 1 (make-pair 2 empty)) kann wie folgt dargestellt werden: make pair make pair 1 2 empty 1 make pair make pair 2 empty
16 3.2.7 Operationen auf Listen Typprädikate empty?, pair? Konstruktor empty liefert die leere Liste Konstruktor (: make-pair (%value (list %value) -> (list %value))) erweitert die Liste um ein neues Kopfelement Selektor (: first ((list %value) -> %value)) liefert das erste Element (Kopfelement) Selektor (: rest ((list %value) -> (list %value))) liefert den Rest der Liste, d.h. die Liste ohne das Kopfelement
17 3.2.8 Beispiele für die Grundoperationen auf Listen (define liste-1 empty) (define liste-2 (make-pair 1 liste-1)) (define liste-3 (make-pair 2 liste-2)) (define liste-4 (make-pair 4 liste-3)) (first liste-2) => 1 (rest liste-2) => #<empty-list> (first liste-3) => 2 (rest liste-3) => #<record:pair 1 #<empty-list>>
18 3.2.9 Listenverträge Standardlistenvertrag: %value Liste mit beliebigen Elementen Andere Verträge für die Listenelemente möglich: (list number) (list string) (list (list boolean)) (list (mixed number string)) Definition: Die Liste xs erfüllt den Vertrag (list c) genau dann, wenn xs ist leer oder xs ist ein Paar, so dass (first xs) erfüllt den Vertrag c und (rest xs) erfüllt den Vertrag (list c).
19 3.3 Prozeduren, die Listen konsumieren Summe der Listenelemente ; Elemente einer Liste addieren (: list-sum ((list number) -> number)) (define list-sum (lambda (xs) (cond ((empty? xs)...) ((pair? xs) (... (first xs)... (rest xs)...))))) Vorgehensweise bis hierher: Konstruktionsanleitung für Prozeduren Konstruktionsanleitung für gemischte Daten (Liste ist gemischter Datentyp)
20 3.3.2 Neuer Schritt: Komponente besitzt Listentyp Aus (: xs (list number)) und (: rest ((list number) -> (list number))) ergibt sich (rest xs) : (list number) Standardansatz: verwende das Ergebnis von (list-sum (rest xs)) ; Elemente einer Liste addieren (: list-sum ((list number) -> number)) (define list-sum (lambda (xs) (cond ((empty? xs)...) ((pair? xs) (... (first xs)... (list-sum (rest xs))...)))))
21 3.3.3 Ausfüllen der Schablone ; Elemente einer Liste addieren (: list-sum ((list number) -> number)) (define list-sum (lambda (xs) (cond ((empty? xs) 0) ((pair? xs) (+ (first xs) (list-sum (rest xs)))))))
22 3.3.4 Länge einer Liste ; Anzahl der Elemente einer Liste bestimmen (: list-length ((list %a) -> number)) (define list-length (lambda (l) (cond ((empty? l)...) ((pair? l) (... (first l)... (list-length (rest l))...))))) Gerüst und Schablone genau wie bei list-sum
23 Definition: (define list-length (lambda (l) (cond ((empty? l) 0) ((pair? l) (+ 1 (list-length (rest l))))))) Tests: (check-expect (list-length empty) 0) (check-expect (list-length (liste-3)) 3) vordefiniert als: length parametrisch polymorpher Vertrag (: length ((list %a) -> number)) die Länge einer Liste ist unabhängig von Sorte der Listenelemente.
24 Berechnungsprozess (list-length (make-pair 1 (make-pair 2 empty)))) => (cond ((empty? (make-pair 1 (make-pair 2 empty))) ; #f 0) ((pair? (make-pair 1 (make-pair 2 empty))) ; #t (+ 1 (list-length (rest (make-pair 1 (make-pair 2 empty))))))) => (+ 1 (list-length (rest (make-pair 1 (make-pair 2 empty))))) => (+ 1 (list-length (make-pair 2 empty))) => (+ 1 (+ 1 (list-length empty))) => (+ 1 (+ 1 0)) => 2
25 Konstruktionsanleitung 7 (Listen) Eine Prozedur, die eine Liste konsumiert, hat folgende Schablone: (: p ((list c) -> t)) (define p (lambda (l) (cond ((empty? l)...) ((pair? l)... (first l)... (p (rest l))...)))) Fülle zuerst den empty? Zweig aus. Fülle dann den pair? Zweig aus unter der Annahme, dass der rekursive Aufruf (p (rest l)) das gewünschte Ergebnis für den Rest der Liste liefert und (first l) den Vertrag c erfüllt.
26 #7 (Prozeduren über Listen) Befolge für Prozeduren, die Listen konsumieren, zuerst die Konstruktionsanleitung und schreibe Vertrag, Gerüst und Schablone auf, vor tieferem Nachdenken über die Aufgabenstellung! #8 (Flaches Denken) Denke niemals rekursiv über einen rekursiven Prozess nach!
27 Quelle
28 3.4 Zusammenfassung Polymorphie Definition von Listen Listenverträge Rekursion: Listen als Argumente
29 3.5 Rekursion über Zahlen Natürliche Zahlen als gemischter, rekursiver Datentyp ; Eine natürliche Zahl ist eins der folgenden ; - die Null ; - der Nachfolger einer natürlichen Zahl ; Name: natural Die Konstruktoren für natürliche Zahlen sind demnach ; Konstruktor für Null (: zero natural) (define zero 0) ; Konstruktor für Nachfolger (: succ (natural -> natural)) (define succ (lambda (x) (+ x 1)))
30 3.5.2 Selektor für natürliche Zahlen Der Selektor von natural ist nur für natürliche Zahlen größer 0 definiert: die Vorgängerfunktion ; Selektor für Nachfolger von natürlichen Zahlen (: pred (natural -> natural)) (define pred (lambda (x) (- x 1)))
31 3.5.3 Prozeduren, die natürliche Zahlen konsumieren Beispiel: die Fakultätsfunktion n! = n (n 1) (n 2) 1 1! = 1 2! = 2 3! = 6 4! = 24.
32 3.5.4 Beispiel: Fakultätsfunktion Verwende den Ansatz für gemischte Daten... ; n! berechnen (: factorial (natural -> natural)) (define factorial (lambda (n) (cond ((zero? n)...) (else...)))) Anmerkung Immer zwei Fälle: Verwende if anstelle von cond Im else-zweig ist (> n 0), also ist die Vorgängerfunktion auf n anwendbar
33 3.5.5 Beispiel: Fakultätsfunktion (Forts.) ; n! berechnen (: factorial (natural -> natural)) (define factorial (lambda (n) (if (zero? n) (pred n)...))) Anmerkung: (pred n) ist gleich (- n 1) Da (pred n) wieder die Sorte natural hat, ist factorial darauf anwendbar.
34 3.5.6 Beispiel: Fakultätsfunktion (Forts.) ; n! berechnen (: factorial (natural -> natural)) (define factorial (lambda (n) (if (zero? n) (factorial (- n 1))...))) Anmerkung: Die Definition war: n! = n (n 1) (n 2) 1 Daher ist (factorial n) gleich (* n (factorial (- n 1))).
35 3.5.7 Beispiel: Fakultätsfunktion (Forts.) ; n! berechnen (: factorial (natural -> natural)) (define factorial (lambda (n) (if (zero? n)... (* n (factorial (- n 1)))))) Anmerkung: Es fehlt der (Basis-) Fall (factorial 0). Berechne diesen Fall durch Auswertung von (factorial 1) mit dem Substitutionsmodell.
36 3.5.8 (factorial 1) (factorial 1) => (if (zero? 1)... (* 1 (factorial (- 1 1)))) => (* 1 (factorial (- 1 1))) => (* 1 (factorial 0)) => (* 1 (if (zero? 0)... (* 0 (factorial (- 0 1))))) => (* 1...) ; die einzige Möglichkeit ist... = 1 => 1
37 3.5.9 Beispiel: Fakultätsfunktion (Ergebnis) ; n! berechnen (: factorial (natural -> natural)) (define factorial (lambda (n) (if (zero? n) 1 (* n (factorial (- n 1))))))
38 Konstruktionsanleitung 8 (natürliche Zahlen) Eine Prozedur, die eine natürliche Zahl konsumiert, hat folgende Schablone: (: p (natural -> t)) (define p (lambda (n) (if (zero?n) (p (- n 1))...))) Fülle zuerst den (zero?...) Zweig aus. Fülle dann den else Zweig aus unter der Annahme, dass (p (- n 1)), der rekursive Aufruf von p, das gewünschte Ergebnis für den Vorgänger der natürlichen Zahl liefert.
39 3.6 Nichttermination Eine rekursive Funktion, die nicht eine der Konstruktionsanleitungen für Listen oder natürliche Zahlen verwendet, muss nicht immer ein Ergebnis liefern. Beispiel: direkter rekursiver Aufruf ; nichts tun (: waste-time (number -> number)) (define waste-time (lambda (x) (waste x))) Beispiel: Fehler in der Schablone (Selektor vergessen) ; n! nicht berechnen (: notfac (natural -> natural)) (define notfac (lambda (n) (if (zero? n) 1 (* n (notfac n)))))
40 Beispiel: Fehler in der Schablone (Fallunterscheidung vergessen) ; n! nicht berechnen (: notfac2 (natural -> natural)) (define notfac2 (lambda (n) (* n (notfac2 (- n 1)))))
41 Nichtterminierende Berechnungsprozesse Alle drei Definitionen erzeugen nichtterminierende Berechnungsprozesse: (waste-time 0) => (waste-time 0) => (waste-time 0) =>... (notfac 2) => (* 2 (notfac 2)) => (* 2 (* 2 (notfac 2))) => (* 2 (* 2 (* 2 (notfac 2)))) => (* 2 (* 2 (* 2 (* 2 (notfac 2))))) =>... (notfac2 42) => (* 42 (notfac2 41)) => (* 42 (* 41 (notfac2 40))) => (* 42 (* 41 (* 40 (notfac2 39)))) => (* 42 (* 41 (* 40 (* 39 (notfac2 38))))) =>...
42 3.6.1 Terminierende Berechnungsprozesse Ein Berechnungsprozess terminiert, falls er nach endlich vielen Berechnungsschritten mit einem Wert endet. Anderenfalls ist der Berechnungsprozess nichtterminierend. Eine Prozedur, die nach der Konstruktionsanleitung für Listen bzw. für natürliche Zahlen geschrieben ist, terminiert für jede vertragsgemäße Eingabe.
43 3.7 Iterative Berechnungsprozesse Der Berechnungsprozess für factorial wächst mit der Größe der Eingabe. (factorial 15) => (* 15 (factorial 14)) => (* 15 (* 14 (factorial 13))) => (* 15 (* 14 (* 13 (factorial 12)))) => (* 15 (* 14 (* 13 (* 12 (factorial 11))))) => (* 15 (* 14 (* 13 (* 12 (* 11 (factorial 10)))))) => (* 15 (* 14 (* 13 (* 12 (* 11 (* 10 (factorial 9))))))) => (* 15 (* 14 (* 13 (* 12 (* 11 (* 10 (* 9 (factorial 8)))))))) => (* 15 (* 14 (* 13 (* 12 (* 11 (* 10 (* 9 (* 8 (factorial 7))))))))) => (* 15 (* 14 (* 13 (* 12 (* 11 (* 10 (* 9 (* 8 (* 7 (factorial 6)))))))))) => (* 15 (* 14 (* 13 (* 12 (* 11 (* 10 (* 9 (* 8 (* 7 (* 6 (factorial 5))))))))))) => (* 15 (* 14 (* 13 (* 12 (* 11 (* 10 (* 9 (* 8 (* 7 (* 6 (* 5 (factorial 4))))))))) => (* 15 (* 14 (* 13 (* 12 (* 11 (* 10 (* 9 (* 8 (* 7 (* 6 (* 5 (* 4 (factorial 3)))) => (* 15 (* 14 (* 13 (* 12 (* 11 (* 10 (* 9 (* 8 (* 7 (* 6 (* 5 (* 4 (* 3 (factorial => (* 15 (* 14 (* 13 (* 12 (* 11 (* 10 (* 9 (* 8 (* 7 (* 6 (* 5 (* 4 (* 3 (* 2 (facto => (* 15 (* 14 (* 13 (* 12 (* 11 (* 10 (* 9 (* 8 (* 7 (* 6 (* 5 (* 4 (* 3 (* 2 (* 1 ( =>...
44 3.7.1 Platzverbrauch eines Berechnungsprozesses Die Größe des Ausdrucks ist proportional zum Platzverbrauch für die Auswertung in der Maschine. Verbesserungsidee: Ändern des Berechnungsprozesses, so dass die Ausdrücke eine bestimmte Größe nicht überschreiten konstanter Platzverbrauch. Der Ausdruck (* 15 (* 14 (* 13 (* 12 (* 11 (* 10 (* 9 (* 8 (* 7 (factorial 6)))))))))) kann erst auswertet werden, wenn der Wert von (factorial 6) vorliegt. Ausnutzen der Assoziativität von * liefert (* (* (* (* (* (* (* (* (* 15 14) 13) 12) 11) 10) 9) 8) 7) (factorial 6)) Multiplikationen könnten vorgezogen werden: (* (factorial 6))))))))))
45 3.7.2 Alternative Definition der Fakultätsfunktion ; Produkt der Zahlen 1.. n berechnen (: it-factorial (natural -> natural)) (define it-factorial (lambda (n) (it-factorial-1 n 1))) Ansatz: Definiere Hilfsfunktion it-factorial-1 Das neue, zweite Argument ist ein Akkumulator, es schleift ein Zwischenergebnis der Berechnung durch den Berechnungsprozess. Ein Aufruf (it-factorial-1 n r) berechnet n! r. Also liefert (it-factorial-1 n 1) gerade n! 1 = n!.
46 3.7.3 Iterative Definition der Hilfsfunktion ; Produkt n! * result berechnen (: it-factorial-1 (natural natural -> natural)) (define it-factorial-1 (lambda (n result) (if (zero? n) result (it-factorial-1 (- n 1) (* n result))))) Die Prozedur it-factorial-1 besitzt nur iterative Berechnungsprozesse.
47 3.7.4 Iterativer Berechnungsprozess (it-factorial 3) => (it-factorial-1 3 1) => (if (= 3 0) 1 (it-factorial-1 (- 3 1) (* 3 1))) => (it-factorial-1 2 3) => (if (= 2 0) 3 (it-factorial-1 (- 2 1) (* 2 3))) => (it-factorial-1 1 6) => (if (= 1 0) 6 (it-factorial-1 (- 1 1) (* 1 6))) => (it-factorial-1 0 6) => (if (= 0 0) 6 (it-factorial-1 (- 0 1) (* 0 6))) => 6
48 3.7.5 Ein Berechnungsprozess konstanter Größe => (it-factorial ) => (it-factorial ) => (it-factorial ) => (it-factorial ) => (it-factorial ) => (it-factorial ) => (it-factorial ) => (it-factorial ) => (it-factorial ) => (it-factorial ) => (it-factorial ) => (it-factorial ) => (it-factorial ) => (it-factorial ) => (it-factorial ) => (it-factorial ) => Grösse des iterativen Berechnungsprozesses bleibt konstant
49 3.7.6 Endrekursion und Iteration Ein Berechnungsprozess ist iterativ, falls seine Größe konstant bleibt. Ein Funktionsaufruf ist endrekursiv, falls er den vorangehenden Funktionsaufruf vollständig ersetzt. Beispiel Endrekursiv: nur iterative Berechnungsprozesse, Größe konstant (define it-factorial-1 (lambda (n result) (if (zero? n) result (it-factorial-1 (- n 1) (* n result))))) Nicht endrekursiv: rekursive Berechnungsprozesse, Größe nicht konstant (hier: proportional zur Eingabe) (define factorial (lambda (n) (if (zero? n) 1 (* n (factorial (- n 1))))))
50 Prozeduren mit Akkumulatoren sind wichtig, da ihre Berechnungsprozesse iterativ sind!
51 3.7.7 Konstruktionsanleitung: Prozedur mit Akkumulator (Zahlen) Prozedur mit Akkumulator, die natürliche Zahlen konsumiert (define result (contract...)) (: proc (natural -> result)) (define proc (lambda (n) (proc-helper n result-for-0))) (: proc-helper (natural result -> result)) (define proc-helper (lambda (n acc) (if (= n 0) acc (proc-helper (- n 1) (... n... acc...))))) Dabei berechnet result-for-0 das Ergebnis für n = 0 und (... n... acc...) berechnet das nächste Zwischenergebnis.
52 3.7.8 Konstruktionsanleitung: Prozedur mit Akkumulator (Listen) Prozedur mit Akkumulator, die Listen konsumiert (define elem (contract...)) (define result (contract...)) (: proc ((list elem) -> result)) (define proc (lambda (l) (proc-helper l result-for-empty))) (: proc-helper ((list elem) result -> result)) (define proc-helper (lambda (l acc) (if (empty? l) acc (proc-helper (rest l) (... (first l)... acc...))))) Dabei berechnet result-for-empty das Ergebnis für die leere Liste und (... (first l)... acc...) berechnet das nächste Zwischenergebnis.
53 3.7.9 Beispiel: Prozedur mit Akkumulator (Listen) Invertieren einer Liste (: invert ((list %a) -> (list %a))) (define invert (lambda (l) (invert-helper l empty))) (: invert-helper ((list %a) (list %a) -> (list %a))) (define invert-helper (lambda (l acc) (if (empty? l) acc (invert-helper (rest l) (make-pair (first l) acc)))))
54 3.8 Zusammenfassung Natürliche Zahlen als gemischter, rekursiver Datentyp Rekursion: natürliche Zahlen als Argumente Nichttermination Endrekursion, Iteration, Akkumulatoren
Fallstudie: Nim Spiel
Fallstudie: Nim Spiel Angeblich chinesischen Ursprungs (Jianshizi) Interessant für Spieltheorie: vollständig analysierbar Frühzeitig computerisiert 1939 Nimatron (Weltausstellung New York) 1951 Nimrod
Lösung Probeklausur Informatik I
Lösung Probeklausur Informatik I 1 Lösung Aufgabe 1 (5 Punkte) Algorithmen und Programme Was ist der Unterschied zwischen einem Algorithmus und einem Programm? Ein Algorithmus ist eine Vorschrift zur Durchführung
Bisher. Programme. Ausdrücke und ihre Auswertung (Substitutionsmodell)
Bisher Programme Ausdrücke und ihre Auswertung (Substitutionsmodell) Konstruktionsanleitung für Prozeduren Kurzbeschreibung Sorten und Verträge Gerüst Testfälle Rumpf ausfüllen Testen 2.21 Erinnerung:
13 Abstrakte Datentypen
13 Abstrakte Datentypen Bisher: Konkrete Datentypen Menge von Elementen Operationen auf den Elementen (Konstruktoren, Selektoren, Typprädikate) Eigenschaften abgeleitet Jetzt: Abstrakte Datentypen (ADT)
26 Hierarchisch strukturierte Daten
Algorithmik II Peter Wilke Sommersemester 2005 Teil III Funktionale Programmierung 26 Hierarchisch strukturierte Daten Peter Wilke Algorithmik II Sommersemester 2005 1 Peter Wilke Algorithmik II Sommersemester
Aufgabe: Platz-effiziente Kompression von Textdaten
7.3 Huffman-Bäume Anwendung von Binärbäumen Aufgabe: Platz-effiziente Kompression von Textdaten Standardcodierungen von Textdaten ISO-8859-1: 8 Bit pro Zeichen UTF-16: 16 Bit pro Zeichen Codierungen mit
18 Generative Rekursion
18 Generative Rekursion Bisher: Funktionsdefinition durch Muster für induktive Datentypen strukturelle Rekursion Jetzt: Verallgemeinerung zu generativer (allgemeiner) Rekursion keine direkte Anlehnung
10 Abstrakte Datentypen
10 Abstrakte Datentypen abstrakte Datentypen generische Implementierung datengesteuerte Programmierung Operationstabelle 10.1 Abstrakte Datentypen Bisher: Konkrete Datentypen Menge von Elementen Operationen
Informatik I. Informatik I. 3.1 Wiederholung. 3.2 Die Sorten boolean und string. 3.3 Verzweigungen. 3.1 Wiederholung. Bisher...
Informatik I 26. Oktober 2010 3. und Wahrheitswerte Informatik I 3. und Wahrheitswerte Jan-Georg Smaus Albert-Ludwigs-Universität Freiburg 3.1 Wiederholung 3.2 Die Sorten boolean und string 3.3 26. Oktober
Workshop Einführung in die Sprache Haskell
Workshop Einführung in die Sprache Haskell Nils Rexin, Marcellus Siegburg und Alexander Bau Fakultät für Informatik, Mathematik und Naturwissenschaften Hochschule für Technik, Wirtschaft und Kultur Leipzig
Funktionale Programmierung ALP I. Die Natur rekursiver Funktionen SS Prof. Dr. Margarita Esponda. Prof. Dr.
ALP I Die Natur rekursiver Funktionen SS 2011 Die Natur rekursiver Funktionen Rekursive Funktionen haben oft folgende allgemeine Form: f :: a -> a f 0 = c f (n+1) = h (f n ) Diese Art der Definitionen
Prof. Dr. Margarita Esponda
Analyse von Algorithmen Die O-Notation WS 2012/2013 Prof. Dr. Margarita Esponda Freie Universität Berlin 1 Korrekte und effiziente Lösung von Problemen Problem Wesentlicher Teil der Lösung eines Problems.
Inhalt Kapitel 2: Rekursion
Inhalt Kapitel 2: Rekursion 1 Beispiele und Definition 2 Partialität und Terminierung 3 Formen der Rekursion Endständige Rekursion 4 Einbettung 29 Beispiele und Definition Rekursion 30 Man kann eine Funktion
Einführung in die funktionale Programmierung
Einführung in die funktionale Programmierung Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 26. Oktober 2006 Haskell - Einführung Syntax Typen Auswertung Programmierung
Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen:
Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen: take 1 0 ( f i l t e r ( fn x => x mod 2=0) nat ) ; val it =
Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter
Software Entwicklung 1 Annette Bieniusa / Arnd Poetzsch-Heffter Fallstudie: Arithmetische Ausdrücke AG Softech FB Informatik TU Kaiserslautern Bieniusa/Poetzsch-Heffter Software Entwicklung 1 2/ 33 Überblick
Grundlagen der Programmierung 2. Operationale Semantik
Grundlagen der Programmierung 2 Operationale Semantik Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 29. April 2009 Semantik von Programmiersprachen Semantik = Bedeutung
Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Rekursion vs. Iteration, Sortieren
Rekursion Rekursive Funktionen, Korrektheit, Terminierung, Rekursion vs. Iteration, Sortieren Mathematische Rekursion o Viele mathematische Funktionen sind sehr natürlich rekursiv definierbar, d.h. o die
Stand der Vorlesung Komplexität von Algorithmen (Kapitel 3)
Stand der Vorlesung Komplexität von Algorithmen (Kapitel 3) Technische Universität München Motivation: IT gestützte Steuerung, Überwachung, Fertigung, Produktion,. : erfordert effiziente Berechnungsvorschriften
( )= c+t(n-1) n>1. Stand der Vorlesung Komplexität von Algorithmen (Kapitel 3)
Stand der Vorlesung Komplexität von Algorithmen (Kapitel 3) Motivation: IT gestützte Steuerung, Überwachung, Fertigung, Produktion,. : erfordert effiziente Berechnungsvorschriften Ziel: Methoden kennen
Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Rekursion vs. Iteration, Sortieren
Rekursion Rekursive Funktionen, Korrektheit, Terminierung, Rekursion vs. Iteration, Sortieren Mathematische Rekursion o Viele mathematische Funktionen sind sehr natürlich rekursiv definierbar, d.h. o die
Die Definition eines Typen kann rekursiv sein, d.h. Typ-Konstruktoren dürfen Elemente des zu definierenden Typ erhalten.
4.5.5 Rekursive Typen Die Definition eines Typen kann rekursiv sein, d.h. Typ-Konstruktoren dürfen Elemente des zu definierenden Typ erhalten. datatype IntList = Nil Cons o f ( i n t IntList ) ; Damit
Funktionale Programmierung ALP I. Funktionen höherer Ordnung. Teil 2 SS 2013. Prof. Dr. Margarita Esponda. Prof. Dr.
ALP I Funktionen höherer Ordnung Teil 2 SS 2013 Funktionen höherer Ordnung Nehmen wir an, wir möchten alle Zahlen innerhalb einer Liste miteinander addieren addall:: (Num a) => [a -> a addall [ = 0 addall
Übungsblatt 6: Softwareentwicklung I (WS 2006/07)
Prof. Dr. A. Poetzsch-Heffter Dipl.-Inform. J.O. Blech Dipl.-Inform. M.J. Gawkowski Dipl.-Inform. N. Rauch Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik Übungsblatt 6:
Informatik I. 7. Der let-ausdruck und eine graphische Anwendung. 18. November Albert-Ludwigs-Universität Freiburg. Informatik I.
7. und eine graphische Anwendung Albert-Ludwigs-Universität Freiburg 18. November 2010 1 / 24 2 / 24 Wiederholte Berechnungen: (define square-sum (lambda (x y) (* (+ x y) (+ x y)))) wiederholt die Auswertung
12 Abstrakte Klassen, finale Klassen und Interfaces
12 Abstrakte Klassen, finale Klassen und Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält,
3.6.4 Rekursive Funktionen
Klassifizierung von Funktionen mit Hilfe der Abstützrelation (Wenn eine Funktionsdefinition für f eine Funktion g aufruft, dann besteht zwischen beiden Definitionen die Relation f benutzt g ) Klasse 0
Speicher und Adressraum
Linearer Speicher (Adressraum) Technische Universität München Speicher und Adressraum Freie Speicherhalde (Heap) Freier Speicherstapel (Stack) Globale Variablen Bibliotheksfunktionen Laufzeitsystem Programmcode
Informatik I. Informatik I. 7.1 Der let-ausdruck. 7.2 Das Graphik-Paket image.ss. 7.3 Fraktale Bilder. Wiederholte Berechnungen: Der let-ausdruck
Informatik I 18. November 2010 7. und eine graphische Anwendung Informatik I 7. und eine graphische Anwendung Jan-Georg Smaus Albert-Ludwigs-Universität Freiburg 7.1 7.2 7.3 18. November 2010 Jan-Georg
Informatik I: Einführung in die Programmierung
Informatik I: Einführung in die Programmierung 7. Albert-Ludwigs-Universität Freiburg Bernhard Nebel 31. Oktober 2014 1 31. Oktober 2014 B. Nebel Info I 3 / 20 Um zu, muss man zuerst einmal. Abb. in Public
Funktionale Programmierung ALP I. Funktionen höherer Ordnung SS Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda
ALP I SS 2011 Funktionstypen Funktionen haben einen Datentyp, der folgende allgemeine Form hat: functionname :: T 1 -> T 2, wobei T 1, T 2 wiederum beliebige Datentypen sind Beispiel: T 1 T 2 Der Datentyp
Algorithmen & Programmierung. Rekursive Funktionen (1)
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
Gliederung. Algorithmen und Datenstrukturen I. Listen in Haskell: Listen in Haskell: Listen in Haskell. Datentyp Liste Strings Listenkomprehension
Gliederung Algorithmen und Datenstrukturen I D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg 1 Winter 2009/10, 16. Oktober 2009, c
Großübung zu Einführung in die Programmierung
Großübung zu Einführung in die Programmierung Daniel Bimschas, M.Sc. Institut für Telematik, Universität zu Lübeck https://www.itm.uni-luebeck.de/people/bimschas Inhalt 1. Besprechung Übung 4 Iteration
Methoden zur Interpretation LISPähnlicher. Programmiersprachen. Seminarvortrag / 53 FH AACHEN FACHBEREICH 9 TOBIAS STUMM MATR.-NR.
Methoden zur Interpretation LISPähnlicher Programmiersprachen Seminarvortrag 20.01.2017 FACHBEREICH 9 TOBIAS STUMM MATR.-NR. 4012917 1 Inhalt Motivation Lisp > Definition > Scheme Interpreter > Definition
TU Darmstadt Fachbereich Informatik Studiendekanat :30-09:30 Uhr Hinweise:
TU Darmstadt Fachbereich Informatik Studiendekanat Zwischenklausur II - Lösungsvorschlag Grundlagen der Informatik I Sommer 2014 09. 07. 2014 07:30-09:30 Uhr Hinweise: Als Schreibmittel ist nur ein schwarzer
C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22
C++ Teil 2 Sven Groß IGPM, RWTH Aachen 16. Apr 2015 Sven Groß (IGPM, RWTH Aachen) C++ Teil 2 16. Apr 2015 1 / 22 Themen der letzten Vorlesung Hallo Welt Elementare Datentypen Ein-/Ausgabe Operatoren Sven
Übungsblatt 10. Thema: Abstrakte Datentypen, Datenstrukturen in Java
Informatik I WS 05/06 Prof. Dr. W. May Dipl.-Inform. Oliver Fritzen Dipl.-Inform. Christian Kubczak Übungsblatt 10 Ausgegeben am: Abgabe bis: 13.01.2006 24.1.2006 (Theorie) 27.1.2006 (Praktisch) Thema:
Programmierkurs II. Typsynonyme & algebraische Datentypen
Programmierkurs II Typsynonyme & algebraische Datentypen Um Dinge der realen Welt abzubilden, ist es nur in den seltensten Fällen komfortabel alles als Zahlen, Strings oder Listen zu kodieren. Wir benötigen
Übungen zu Softwareentwicklung III, Funktionale Programmierung
Übungen zu Softwareentwicklung III, Funktionale Programmierung Blatt 10, Woche 12 Funktionen höherer Ordnung und kombinatorische Probleme Leonie Dreschler-Fischer WS 2014/2015 Ausgabe: Freitag, 9.2015,
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1
Kapitel 13 Listen Listen 1 Ziele Implementierungen für Listen kennenlernen Einfach verkettete und doppelt verkettete Listen verstehen Listen-Implementierungen in der Java-Bibliothek kennenlernen Durch
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1
Kapitel 12 Listen Listen 1 Ziele Implementierungen für Listen kennenlernen Einfach verkettete und doppelt verkettete Listen verstehen Listen-Implementierungen in der Java-Bibliothek kennenlernen Durch
Paradigmen der Programmierung
SS 11 Prüfungsklausur 25.07.2011 Aufgabe 5 (6+9 = 15 Punkte) a) Bestimmen Sie jeweils den Typ der folgenden Haskell-Ausdrücke: ( 1, 2 :"3", 4 < 5) :: (Char, String, Bool) [(last, tail), (head, take 5)]
Mathematische Rekursion
Rekursion Mathematische Rekursion o Viele mathematische Funktionen sind sehr natürlich rekursiv definierbar, d.h. o die Funktion erscheint in ihrer eigenen Definition. Mathematische Rekursion o Viele mathematische
Programmierung WS18/19 Übungsblatt 9 (Abgabe Freitag, den um 12 Uhr)
Prof. aa Dr. J. Giesl S. Dollase, M. Hark, D. Korzeniewski Aufgabe 2 (Datenstrukturen in Haskell): (2 + 1 + 2 + 2.5 + 3.5 = 11 Punkte) In dieser Aufgabe geht es darum, arithmetische Ausdrücke auszuwerten.
Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie
Rev. 2749 1 [28] Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom 04.11.2014: Typvariablen und Polymorphie Christoph Lüth Universität Bremen Wintersemester 2014/15 2 [28] Fahrplan Teil
Einführung in die Funktionale Programmierung mit Haskell
Einführung in die Funktionale Programmierung mit Haskell Rekursion LFE Theoretische Informatik, Institut für Informatik, Ludwig-Maximilians Universität, München 25. April 2013 Planung Achtung: Nächste
Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom : Funktionen Höherer Ordnung I
Rev. 2766 1 [33] Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom 11.11.2014: Funktionen Höherer Ordnung I Christoph Lüth Universität Bremen Wintersemester 2014/15 2 [33] Fahrplan Teil
Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):
Was bisher geschah deklarative Programmierung funktional: Programm: Menge von Termgleichungen, Term Auswertung: Pattern matsching, Termumformungen logisch: Programm: Menge von Regeln (Horn-Formeln), Formel
ALP I. Funktionale Programmierung
ALP I Funktionale Programmierung Zusammengesetzte Datentypen in Haskell WS 2012/2013 Zusammengesetzte Datentypen Tupel List String Zusammengesetzte Datentypen Tupel-Datentyp Ein Tupel ist eine Ansammlung
Informatik I. Informatik I Iteration vs. Rekursion. Iteration vs. Rekursion Iteration vs. Rekursion. 20. Iteration vs.
Informatik I 1. Februar 2011 20. Informatik I 20. Jan-Georg Smaus 20.1 Albert-Ludwigs-Universität Freiburg 1. Februar 2011 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 1 / 31 Jan-Georg
Funktionale Programmierung ALP I. λ Kalkül. Teil 2 WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda
ALP I λ Kalkül Teil 2 WS 2012/2013 Lokale Variablennamen Haskell: let x = exp1 in exp2 Lambda: λ exp1. exp2 Einfache Regel: Der Geltungsbereich eines Lambda-Ausdrucks erstreckt sich soweit wie möglich
Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell
Haskell, Typen, und Typberechnung Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr. Manfred Schmidt-Schauß Ziele: Haskells Typisierung Typisierungs-Regeln Typ-Berechnung Milners
FAKULTÄT FÜR INFORMATIK
TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen WS 2008/09 Einführung in die Informatik 2 Übungsblatt 10 Prof. Dr. Helmut Seidl, T. M. Gawlitza,
Programmieren lernen mit Groovy Rekursion Rekursion und Iteration
Programmieren lernen mit Groovy Rekursion Seite 1 Rekursion Rekursion Ursprung lat. recurrere ~ zurücklaufen rekursive Definition Definition mit Bezug auf sich selbst Beispiel Fakultätsfunktion n! 0! =
GTI. Hannes Diener. 18. Juni. ENC B-0123,
GTI Hannes Diener ENC B-0123, [email protected] 18. Juni 1 / 32 Als Literatur zu diesem Thema empfiehlt sich das Buch Theoretische Informatik kurzgefasst von Uwe Schöning (mittlerweile in der 5.
Übung zu Algorithmen und Datenstrukturen (für ET/IT)
Übung zu Algorithmen und Datenstrukturen (für ET/IT) Sommersemester 2015 Matthias Wieczorek Computer-Aided Medical Procedures Technische Universität München Administratives Zentralübung (Mittwoch, 09:45
15. Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Aufrufstapel, Bau eines Taschenrechners, BNF, Parsen
453 15. Rekursion Rekursive Funktionen, Korrektheit, Terminierung, Aufrufstapel, Bau eines Taschenrechners, BNF, Parsen Mathematische Rekursion 454 Viele mathematische Funktionen sind sehr natürlich rekursiv
Beispiele: Funktionsabstraktion (3) Funktionsdeklaration. Funktionsdeklaration (2) Funktionsdeklaration (3) 3. Abstraktion über Funktionsbezeichner:
Beispiele: Funktionsabstraktion (3) Funktionsdeklaration 3. Abstraktion über Funktionsbezeichner: Ausdruck: f (f x) Abstraktion: \ f x -> f (f x) Mit Bezeichnervereinbarung: twice = \ f x -> f (f x) erg
Kapitel 12: Induktive
Kapitel 12: Induktive Datenstrukturen Felix Freiling Lehrstuhl für Praktische Informatik 1 Universität Mannheim Vorlesung Praktische Informatik I im Herbstsemester 2009 Folien nach einer Vorlage von H.-Peter
Übung zu Algorithmen und Datenstrukturen (für ET/IT)
Übung zu Algorithmen und Datenstrukturen (für ET/IT) Sommersemester 2017 Rüdiger Göbl, Mai Bui Computer Aided Medical Procedures Technische Universität München Administratives Zentralübung (Mittwoch, 09:45
Funktionale Programmierung und Typtheorie
Funktionale Programmierung und Typtheorie 5. Fortgeschrittene Konzepte 5.1 Komprehensionen 5.2 Partielle Applikationen 5.3 Strikte und nichtstrikte Funktionen 5.4 Unendliche Datenstrukturen und verzögerte
ALP I Induktion und Rekursion
ALP I Induktion und Rekursion WS 2012/2013 Vollständige Induktion (Mafi I) Die Vollständige Induktion ist eine mathematische Beweistechnik, die auf die Menge der natürlichen Zahlen spezialisiert ist. Vorgehensweise:
4.2 Daten und Datenstrukturen
4.2 Daten und Datenstrukturen Daten Fundamentale Objekte, die in der Rechenanlage erfasst gespeichert ausgegeben (angezeigt, gedruckt) bearbeitet gelöscht werden können. Beispiele: Zahlen, Zeichenfolgen
