14. zeichen und texte ii -...
TRANSCRIPT
![Page 1: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/1.jpg)
14. Zeichen und Texte II
Caesar-Code mit Streams, Texte als Strings, String-Operationen
423
![Page 2: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/2.jpg)
Caesar-Code: Generalisierung
void caesar(int s) {std::cin >> std::noskipws;
char next;while (std::cin >> next) {
std::cout << shift(next, s);}
}
Momentan nur von std::cinnach std::cout
Besser: von beliebigerZeichenquelle (Konsole, Datei,...) zu beliebiger Zeichensenke(Konsole, ...)
. . .Icons: flaticon.com; authors Smashicons, Kirill Kazachek; CC 3.0 BY
425
![Page 3: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/3.jpg)
Caesar-Code: Generalisierung
void caesar(std::istream& in,std::ostream& out,int s) {
in >> std::noskipws;
char next;while (in >> next) {
out << shift(next, s);}
}
std::istream/std::ostreamist ein generischer Eingabe-/Ausgabestrom an chars
Aufruf der Funktion erfolgt mitspezifischen Strömen, z.B.:Konsole (std::cin/cout),Dateien (std::i/ofstream),Strings(std::i/ostringstream)
426
![Page 4: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/4.jpg)
Caesar-Code: Generalisierung
void caesar(std::istream& in,std::ostream& out,int s) {
in >> std::noskipws;
char next;while (in >> next) {
out << shift(next, s);}
}
std::istream/std::ostreamist ein generischer Eingabe-/Ausgabestrom an chars
Aufruf der Funktion erfolgt mitspezifischen Strömen, z.B.:Konsole (std::cin/cout),Dateien (std::i/ofstream),Strings(std::i/ostringstream)
426
![Page 5: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/5.jpg)
Caesar-Code: Generalisierung, Beispiel 1
#include <iostream>...
// in void main():caesar(std::cin, std::cout, s);
Aufruf der generischen caesar-Funktion: Von std::cin nachstd::cout
427
![Page 6: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/6.jpg)
Caesar-Code: Generalisierung, Beispiel 2
#include <iostream>#include <fstream>...
// in void main():std::string from_file_name = ...; // Name of file to read fromstd::string to_file_name = ...; // Name of file to write tostd::ifstream from(from_file_name); // Input file streamstd::ofstream to(to_file_name); // Output file stream
caesar(from, to, s);
Aufruf der generischen caesar-Funktion: Von Datei zu Datei
428
![Page 7: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/7.jpg)
Caesar-Code: Generalisierung, Beispiel 3
#include <iostream>#include <sstream>...
// in void main():std::string plaintext = "My password is 1234";std::istringstream from(plaintext);
caesar(from, std::cout, s);
Aufruf der generischen caesar-Funktion: Von einem String nachstd::cout
429
![Page 8: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/8.jpg)
Texte
Text „Sein oder nicht sein“ könnte als vector<char>repräsentiert werden
Texte sind jedoch allgegenwärtig, daher existiert in derStandardbibliothek ein eigener Typ für sie: std::string(Zeichenkette)Benutzung benötigt #include <string>
430
![Page 9: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/9.jpg)
Texte
Text „Sein oder nicht sein“ könnte als vector<char>repräsentiert werdenTexte sind jedoch allgegenwärtig, daher existiert in derStandardbibliothek ein eigener Typ für sie: std::string(Zeichenkette)Benutzung benötigt #include <string>
430
![Page 10: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/10.jpg)
Benutzung von std::string
Deklaration und Initialisierung mittels Literal:
std::string text = "Essen ist fertig!"
Mit variabler Länge initialisieren:
std::string text(n, ’a’)
Texte vergleichen:
if (text1 == text2) ...
431
![Page 11: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/11.jpg)
Benutzung von std::string
Deklaration und Initialisierung mittels Literal:
std::string text = "Essen ist fertig!"
Mit variabler Länge initialisieren:
std::string text(n, ’a’)
Texte vergleichen:
if (text1 == text2) ...
431
![Page 12: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/12.jpg)
Benutzung von std::string
Deklaration und Initialisierung mittels Literal:
std::string text = "Essen ist fertig!"
Mit variabler Länge initialisieren:
std::string text(n, ’a’)
Texte vergleichen:
if (text1 == text2) ...
431
![Page 13: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/13.jpg)
Benutzung von std::string
Grösse auslesen:
for (unsigned int i = 0; i < text.size(); ++i) ...
Einzelne Zeichen lesen:
if (text[0] == ’a’) ... // or text.at(0)
Einzelne Zeichen schreiben:
text[0] = ’b’; // or text.at(0)
432
![Page 14: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/14.jpg)
Benutzung von std::string
Grösse auslesen:
for (unsigned int i = 0; i < text.size(); ++i) ...
Einzelne Zeichen lesen:
if (text[0] == ’a’) ... // or text.at(0)
Einzelne Zeichen schreiben:
text[0] = ’b’; // or text.at(0)
432
![Page 15: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/15.jpg)
Benutzung von std::string
Grösse auslesen:
for (unsigned int i = 0; i < text.size(); ++i) ...
Einzelne Zeichen lesen:
if (text[0] == ’a’) ... // or text.at(0)
Einzelne Zeichen schreiben:
text[0] = ’b’; // or text.at(0)
432
![Page 16: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/16.jpg)
Benutzung von std::string
Strings konkatenieren (zusammensetzen):
text = ":-";text += ")";assert(text == ":-)");
Viele weitere Operationen, bei Interesse siehehttps://en.cppreference.com/w/cpp/string
433
![Page 17: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/17.jpg)
15. Vektoren II
Mehrdimensionale Vektoren/Vektoren von Vektoren, Kürzeste Wege,Vektoren als Funktionsargumente
434
![Page 18: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/18.jpg)
Mehrdimensionale Vektoren
Zum Speichern von mehrdimensionalen Strukturen wie Tabellen,Matrizen, ...
... können Vektoren von Vektoren verwendet werden:
std::vector<std::vector<int>> m; // An empty matrix
435
![Page 19: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/19.jpg)
Mehrdimensionale Vektoren
Im Speicher: flach
m[0][0] m[0][1] m[0][2] m[1][0] m[1][1] m[1][2]
m[0] m[1]
Im Kopf: Matrix Spalten
Zeilen
0 1 2
0 m[0][0] m[0][1] m[0][2]
1 m[1][0] m[1][1] m[1][2]
436
![Page 20: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/20.jpg)
Mehrdimensionale Vektoren
Im Speicher: flach
m[0][0] m[0][1] m[0][2] m[1][0] m[1][1] m[1][2]
m[0] m[1]
Im Kopf: Matrix Spalten
Zeilen
0 1 2
0 m[0][0] m[0][1] m[0][2]
1 m[1][0] m[1][1] m[1][2]436
![Page 21: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/21.jpg)
Mehrdimensionale Vektoren: Initialisierungsbeispiele
Mittels Literalen:
// A 3−by−5 matrixstd::vector<std::vector<std::string>> m = {
{"ZH", "BE", "LU", "BS", "GE"},{"FR", "VD", "VS", "NE", "JU"},{"AR", "AI", "OW", "IW", "ZG"}
};
assert(m[1][2] == "VS");
437
![Page 22: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/22.jpg)
Mehrdimensionale Vektoren: Initialisierungsbeispiele
Auf bestimmte Grösse füllen:
unsigned int a = ...;unsigned int b = ...;
// An a−by−b matrix with all onesstd::vector<std::vector<int>>
m(a, std::vector<int>(b, 1));
(Es gibt noch viele weitere Wege, Vektoren zu initialisieren)
438
![Page 23: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/23.jpg)
Mehrdimensionale Vektoren: Initialisierungsbeispiele
Auf bestimmte Grösse füllen:
unsigned int a = ...;unsigned int b = ...;
// An a−by−b matrix with all onesstd::vector<std::vector<int>>
m(a, std::vector<int>(b, 1));
(Es gibt noch viele weitere Wege, Vektoren zu initialisieren)
438
![Page 24: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/24.jpg)
Mehrdimensionale Vektoren und Typ-Aliasse
Auch möglich: Vektoren von Vektoren von Vektoren von ...:std::vector<std::vector<std::vector<...>>>Typnamen können offensichtlich laaaaaaaang werden
Dann hilft die Deklaration eines Typ-Alias:using Name = Typ;
Name, unter dem der Typ neuauch angesprochen werden kann
bestehender Typ
439
![Page 25: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/25.jpg)
Mehrdimensionale Vektoren und Typ-Aliasse
Auch möglich: Vektoren von Vektoren von Vektoren von ...:std::vector<std::vector<std::vector<...>>>Typnamen können offensichtlich laaaaaaaang werdenDann hilft die Deklaration eines Typ-Alias:
using Name = Typ;
Name, unter dem der Typ neuauch angesprochen werden kann
bestehender Typ
439
![Page 26: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/26.jpg)
Typ-Aliasse: Beispiel
#include <iostream>#include <vector>using imatrix = std::vector<std::vector<int>>;
// POST: Matrix ’m’ was output to stream ’out’void print(const imatrix& m, std::ostream& out);
int main() {imatrix m = ...;print(m, std::cout);
}
Hinweis: const-Referenz für Effizienz (keine Kopie) und Sicherheit(unveränderlich)
440
![Page 27: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/27.jpg)
Anwendung: Kurzeste WegeFabrik-Halle (n×m quadratische Zellen)
S
T
Startposition des RobotersZielposition des Roboters
Hindernis
freie Zelle
Ziel: Finde den kürzestenWeg des Roboters von Snach T über freie Zellen!
441
![Page 28: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/28.jpg)
Anwendung: Kurzeste WegeFabrik-Halle (n×m quadratische Zellen)
S
T
Startposition des RobotersZielposition des Roboters
Hindernis
freie Zelle
Ziel: Finde den kürzestenWeg des Roboters von Snach T über freie Zellen!
441
![Page 29: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/29.jpg)
Anwendung: Kurzeste WegeFabrik-Halle (n×m quadratische Zellen)
S
T
Startposition des RobotersZielposition des Roboters
Hindernis
freie Zelle
Ziel: Finde den kürzestenWeg des Roboters von Snach T über freie Zellen!
441
![Page 30: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/30.jpg)
Ein (scheinbar) anderes Problem
Finde die Längen der kürzesten Wege zu allen möglichen Zielen
4 5 6 7 8 9 15 16 17 18 19
3 9 10 14 15 16 17 18
2 1 0 10 11 12 13 14 15 16 17
3 2 1 11 12 13 17 18
4 3 2 10 11 12 20 19 18 19
5 4 3 9 10 11 21 20 19 20
6 5 4 8 9 10 22 21 20 21
7 6 5 6 7 8 9 23 22 21 22
443
![Page 31: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/31.jpg)
Ein (scheinbar) anderes Problem
Finde die Längen der kürzesten Wege zu allen möglichen Zielen
4 5 6 7 8 9 15 16 17 18 19
3 9 10 14 15 16 17 18
2 1 0 10 11 12 13 14 15 16 17
3 2 1 11 12 13 17 18
4 3 2 10 11 12 20 19 18 19
5 4 3 9 10 11 21 20 19 20
6 5 4 8 9 10 22 21 20 21
7 6 5 6 7 8 9 23 22 21 22
Das löst auch das Original-Problem: Starte in T;folge einem Weg mit sinkenden Längen
443
![Page 32: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/32.jpg)
Ein (scheinbar) anderes Problem
Finde die Längen der kürzesten Wege zu allen möglichen Zielen
4 5 6 7 8 9 15 16 17 18 19
3 9 10 14 15 16 17 18
2 1 0 10 11 12 13 14 15 16 17
3 2 1 11 12 13 17 18
4 3 2 10 11 12 20 19 18 19
5 4 3 9 10 11 21 20 19 20
6 5 4 8 9 10 22 21 20 21
7 6 5 6 7 8 9 23 22 21 22
Das löst auch das Original-Problem: Starte in T;folge einem Weg mit sinkenden Längen
Startposition
Zielposition.Kürzester Weg:Länge 21
443
![Page 33: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/33.jpg)
Ein (scheinbar) anderes Problem
Finde die Längen der kürzesten Wege zu allen möglichen Zielen
4 5 6 7 8 9 15 16 17 18 19
3 9 10 14 15 16 17 18
2 1 0 10 11 12 13 14 15 16 17
3 2 1 11 12 13 17 18
4 3 2 10 11 12 20 19 18 19
5 4 3 9 10 11 21 20 19 20
6 5 4 8 9 10 22 21 20 21
7 6 5 6 7 8 9 23 22 21 22
Das löst auch das Original-Problem: Starte in T;folge einem Weg mit sinkenden Längen
Startposition
Zielposition.Kürzester Weg:Länge 21
21
443
![Page 34: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/34.jpg)
Ein (scheinbar) anderes Problem
Finde die Längen der kürzesten Wege zu allen möglichen Zielen
4 5 6 7 8 9 15 16 17 18 19
3 9 10 14 15 16 17 18
2 1 0 10 11 12 13 14 15 16 17
3 2 1 11 12 13 17 18
4 3 2 10 11 12 20 19 18 19
5 4 3 9 10 11 21 20 19 20
6 5 4 8 9 10 22 21 20 21
7 6 5 6 7 8 9 23 22 21 22
Das löst auch das Original-Problem: Starte in T;folge einem Weg mit sinkenden Längen
Startposition
Zielposition.Kürzester Weg:Länge 21
21
20
443
![Page 35: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/35.jpg)
Ein (scheinbar) anderes Problem
Finde die Längen der kürzesten Wege zu allen möglichen Zielen
4 5 6 7 8 9 15 16 17 18 19
3 9 10 14 15 16 17 18
2 1 0 10 11 12 13 14 15 16 17
3 2 1 11 12 13 17 18
4 3 2 10 11 12 20 19 18 19
5 4 3 9 10 11 21 20 19 20
6 5 4 8 9 10 22 21 20 21
7 6 5 6 7 8 9 23 22 21 22
Das löst auch das Original-Problem: Starte in T;folge einem Weg mit sinkenden Längen
Startposition
Zielposition.Kürzester Weg:Länge 21
21
20
19
443
![Page 36: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/36.jpg)
Ein (scheinbar) anderes Problem
Finde die Längen der kürzesten Wege zu allen möglichen Zielen
4 5 6 7 8 9 15 16 17 18 19
3 9 10 14 15 16 17 18
2 1 0 10 11 12 13 14 15 16 17
3 2 1 11 12 13 17 18
4 3 2 10 11 12 20 19 18 19
5 4 3 9 10 11 21 20 19 20
6 5 4 8 9 10 22 21 20 21
7 6 5 6 7 8 9 23 22 21 22
Das löst auch das Original-Problem: Starte in T;folge einem Weg mit sinkenden Längen
Startposition
Zielposition.Kürzester Weg:Länge 21
21
20
19 18
443
![Page 37: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/37.jpg)
Ein (scheinbar) anderes Problem
Finde die Längen der kürzesten Wege zu allen möglichen Zielen
4 5 6 7 8 9 15 16 17 18 19
3 9 10 14 15 16 17 18
2 1 0 10 11 12 13 14 15 16 17
3 2 1 11 12 13 17 18
4 3 2 10 11 12 20 19 18 19
5 4 3 9 10 11 21 20 19 20
6 5 4 8 9 10 22 21 20 21
7 6 5 6 7 8 9 23 22 21 22
444
![Page 38: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/38.jpg)
Vorbereitung: Wachter (Sentinels)
S
T
Zeile 0, Spalte 0 Zeile 0, Spalte m+1
Zeile n, Spalte 0 Zeile n+1, Spalte m+1
Umrandung der Halle mit Sentinels zur Ver-meidung von Spezialfällen
446
![Page 39: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/39.jpg)
Vorbereitung: Initiale Markierung
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
-1 -1 0 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-2
start
447
![Page 40: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/40.jpg)
Markierung aller Zellen mit ihren Weglangen
Schritt 0: Alle Zellen mit Weglänge 0
0
T
Unmarkierte Nachbarn derZellen mit Länge 2
451
![Page 41: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/41.jpg)
Markierung aller Zellen mit ihren Weglangen
Schritt 1: Alle Zellen mit Weglänge 1
1 0
1
TUnmarkierte Nachbarn derZellen mit Länge 0
Unmarkierte Nachbarn derZellen mit Länge 2
451
![Page 42: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/42.jpg)
Markierung aller Zellen mit ihren Weglangen
Schritt 2: Alle Zellen mit Weglänge 2
2 1 0
2 1
2
TUnmarkierte Nachbarn derZellen mit Länge 1
Unmarkierte Nachbarn derZellen mit Länge 2
451
![Page 43: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/43.jpg)
Markierung aller Zellen mit ihren Weglangen
Schritt 3: Alle Zellen mit Weglänge 3
3
2 1 0
3 2 1
3 2
3
TUnmarkierte Nachbarn derZellen mit Länge 2
451
![Page 44: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/44.jpg)
Hauptschleife
Finde und markiere alle Zellen mit Weglängen i = 1, 2, 3...for (int i=1;; ++i) {
bool progress = false;for (int r=1; r<n+1; ++r)
for (int c=1; c<m+1; ++c) {if (floor[r][c] != −1) continue;if (floor[r−1][c] == i−1 || floor[r+1][c] == i−1 ||
floor[r][c−1] == i−1 || floor[r][c+1] == i−1 ) {floor[r][c] = i; // label cell with iprogress = true;
}}
if (!progress) break;}
452
![Page 45: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/45.jpg)
Hauptschleife
Finde und markiere alle Zellen mit Weglängen i = 1, 2, 3...for (int i=1;; ++i) {
bool progress = false;for (int r=1; r<n+1; ++r)
for (int c=1; c<m+1; ++c) {if (floor[r][c] != −1) continue;if (floor[r−1][c] == i−1 || floor[r+1][c] == i−1 ||
floor[r][c−1] == i−1 || floor[r][c+1] == i−1 ) {floor[r][c] = i; // label cell with iprogress = true;
}}
if (!progress) break;}
zeigt an, ob in einem Durchlauf durchalle Zellen Fortschritt gemacht wurde
452
![Page 46: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/46.jpg)
Hauptschleife
Finde und markiere alle Zellen mit Weglängen i = 1, 2, 3...for (int i=1;; ++i) {
bool progress = false;for (int r=1; r<n+1; ++r)
for (int c=1; c<m+1; ++c) {if (floor[r][c] != −1) continue;if (floor[r−1][c] == i−1 || floor[r+1][c] == i−1 ||
floor[r][c−1] == i−1 || floor[r][c+1] == i−1 ) {floor[r][c] = i; // label cell with iprogress = true;
}}
if (!progress) break;}
Gehe über alle Zellen
452
![Page 47: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/47.jpg)
Hauptschleife
Finde und markiere alle Zellen mit Weglängen i = 1, 2, 3...for (int i=1;; ++i) {
bool progress = false;for (int r=1; r<n+1; ++r)
for (int c=1; c<m+1; ++c) {if (floor[r][c] != −1) continue;if (floor[r−1][c] == i−1 || floor[r+1][c] == i−1 ||
floor[r][c−1] == i−1 || floor[r][c+1] == i−1 ) {floor[r][c] = i; // label cell with iprogress = true;
}}
if (!progress) break;}
Zelle schon markiert oder Hindernis
452
![Page 48: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/48.jpg)
Hauptschleife
Finde und markiere alle Zellen mit Weglängen i = 1, 2, 3...for (int i=1;; ++i) {
bool progress = false;for (int r=1; r<n+1; ++r)
for (int c=1; c<m+1; ++c) {if (floor[r][c] != −1) continue;if (floor[r−1][c] == i−1 || floor[r+1][c] == i−1 ||
floor[r][c−1] == i−1 || floor[r][c+1] == i−1 ) {floor[r][c] = i; // label cell with iprogress = true;
}}
if (!progress) break;}
Ein Nachbar hat Weglänge i − 1. DieWächter garantieren immer 4 Nach-barn.
452
![Page 49: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/49.jpg)
Hauptschleife
Finde und markiere alle Zellen mit Weglängen i = 1, 2, 3...for (int i=1;; ++i) {
bool progress = false;for (int r=1; r<n+1; ++r)
for (int c=1; c<m+1; ++c) {if (floor[r][c] != −1) continue;if (floor[r−1][c] == i−1 || floor[r+1][c] == i−1 ||
floor[r][c−1] == i−1 || floor[r][c+1] == i−1 ) {floor[r][c] = i; // label cell with iprogress = true;
}}
if (!progress) break;}
Kein Fortschritt, alle erreichbarenZellen markiert; fertig.
452
![Page 50: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/50.jpg)
Das Kurzeste-Wege-Programm
Algorithmus: Breitensuche (Breiten- vs. Tiefensuche wird typischerweisein Algorithmik-Vorlesungen diskutiert)
Das Programm kann recht langsam sein, weil für jedes i alleZellen durchlaufen werdenVerbesserung: Für Markierung i, durchlaufe nur die Nachbarn derZellen mit Markierung i− 1
Verbesserung: Stoppe, sobald das Ziel erreicht wurde
456
![Page 51: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/51.jpg)
Das Kurzeste-Wege-Programm
Algorithmus: Breitensuche (Breiten- vs. Tiefensuche wird typischerweisein Algorithmik-Vorlesungen diskutiert)
Das Programm kann recht langsam sein, weil für jedes i alleZellen durchlaufen werden
Verbesserung: Für Markierung i, durchlaufe nur die Nachbarn derZellen mit Markierung i− 1
Verbesserung: Stoppe, sobald das Ziel erreicht wurde
456
![Page 52: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/52.jpg)
Das Kurzeste-Wege-Programm
Algorithmus: Breitensuche (Breiten- vs. Tiefensuche wird typischerweisein Algorithmik-Vorlesungen diskutiert)
Das Programm kann recht langsam sein, weil für jedes i alleZellen durchlaufen werdenVerbesserung: Für Markierung i, durchlaufe nur die Nachbarn derZellen mit Markierung i− 1
Verbesserung: Stoppe, sobald das Ziel erreicht wurde
456
![Page 53: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/53.jpg)
16. Rekursion 1
Mathematische Rekursion, Terminierung, der Aufrufstapel,Beispiele, Rekursion vs. Iteration, n-Damen Problem, LindenmayerSystem
457
![Page 54: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/54.jpg)
Mathematische Rekursion
Viele mathematische Funktionen sind sehr natürlich rekursivdefinierbar.
Das heisst, die Funktion erscheint in ihrer eigenen Definition.
n! =
{1, falls n ≤ 1
n · (n− 1)!, andernfalls
458
![Page 55: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/55.jpg)
Mathematische Rekursion
Viele mathematische Funktionen sind sehr natürlich rekursivdefinierbar.Das heisst, die Funktion erscheint in ihrer eigenen Definition.
n! =
{1, falls n ≤ 1
n · (n− 1)!, andernfalls
458
![Page 56: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/56.jpg)
Rekursion in C++: Genauso!
n! =
{1, falls n ≤ 1
n · (n− 1)!, andernfalls
// POST: return value is n!unsigned int fac(unsigned int n) {
if (n <= 1)return 1;
elsereturn n * fac(n-1);
}459
![Page 57: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/57.jpg)
Unendliche Rekursion
ist so schlecht wie eine Endlosschleife . . .
. . . nur noch schlechter („verbrennt“ Zeit und Speicher)
void f(){
f(); // f() -> f() -> ... stack overflow}
460
![Page 58: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/58.jpg)
Unendliche Rekursion
ist so schlecht wie eine Endlosschleife . . .. . . nur noch schlechter („verbrennt“ Zeit und Speicher)
void f(){
f(); // f() -> f() -> ... stack overflow}
460
![Page 59: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/59.jpg)
Unendliche Rekursion
ist so schlecht wie eine Endlosschleife . . .. . . nur noch schlechter („verbrennt“ Zeit und Speicher)
void f(){
f(); // f() -> f() -> ... stack overflow}
460
![Page 60: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/60.jpg)
Unendliche Rekursion
ist so schlecht wie eine Endlosschleife . . .. . . nur noch schlechter („verbrennt“ Zeit und Speicher)
void f(){
f(); // f() -> f() -> ... stack overflow}
Ein Euro ist ein Euro.
Wim Duisenberg, erster Präsident der EZB460
![Page 61: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/61.jpg)
Rekursive Funktionen: TerminierungWie bei Schleifen brauchen wir garantierten Fortschritt Richtungeiner Abbruchbedingung (≈ Basisfall)
Beispiel fac(n):Rekursion endet falls n ≤ 1
Rekursiver Aufruf mit neuemArgument < n
Abbruchbedingung wird dahergarantiert erreicht
unsigned int fac(unsigned int n) {
if (n <= 1)return 1;
elsereturn n ∗ fac(n−1);
}
461
![Page 62: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/62.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac(unsigned int n){
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Aufruf von fac(4)462
![Page 63: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/63.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac(unsigned int n){ // n = 4
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Initialisierung des formalen Arguments462
![Page 64: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/64.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac(unsigned int n){ // n = 4
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Auswertung des Rückgabeausdrucks462
![Page 65: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/65.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac(unsigned int n){ // n = 4
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Rekursiver Aufruf mit Argument n− 1 == 3
462
![Page 66: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/66.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac(unsigned int n){ // n = 3
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Initialisierung des formalen Arguments462
![Page 67: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/67.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac(unsigned int n){ // n = 3
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Initialisierung des formalen Arguments
Es gibt jetzt zwei n. Das von fac(4) und das von fac(3)
462
![Page 68: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/68.jpg)
Rekursive Funktionen: Auswertung
Beispiel: fac(4)
// POST: return value is n!unsigned int fac(unsigned int n){
if (n <= 1) return 1;return n * fac(n-1); // n > 1
}
Initialisierung des formalen Arguments
Es wird mit dem n des aktuellen Aufrufs gearbeitet: n = 3
462
![Page 69: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/69.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:
Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
463
![Page 70: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/70.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:
Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
463
![Page 71: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/71.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
463
![Page 72: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/72.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
463
![Page 73: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/73.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
463
![Page 74: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/74.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
463
![Page 75: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/75.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
463
![Page 76: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/76.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
fac(1)
463
![Page 77: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/77.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen Stapel
Es wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1
n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
fac(1)
463
![Page 78: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/78.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten Wertgearbeitet
Am Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1
n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
fac(1)
463
![Page 79: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/79.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1
n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
fac(1) 1
463
![Page 80: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/80.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2)
1
463
![Page 81: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/81.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
fac(2) 2
463
![Page 82: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/82.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3)
2
463
![Page 83: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/83.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
fac(3) 6
463
![Page 84: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/84.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4)
6
463
![Page 85: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/85.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
fac(4) 24
463
![Page 86: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/86.jpg)
Der Aufrufstapel
Bei jedem Funktionsaufruf:Wert des Aufrufarguments kommt aufeinen StapelEs wird immer mit dem obersten WertgearbeitetAm Ende des Aufrufs wird der obersteWert wieder vom Stapel gelöscht
std:cout < < fac(4)
n = 4
n = 3
n = 2
n = 1n = 1 1! = 1
n = 2 2 · 1! = 2
n = 3 3 · 2! = 6
n = 4 4 · 3! = 24
24
463
![Page 87: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/87.jpg)
Euklidischer Algorithmus
findet den grössten gemeinsamen Teiler gcd(a, b) zweiernatürlicher Zahlen a und b
basiert auf folgender mathematischen Rekursion (Beweis imSkript):
gcd(a, b) =
{a, falls b = 0
gcd(b, a mod b), andernfalls
464
![Page 88: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/88.jpg)
Euklidischer Algorithmus
findet den grössten gemeinsamen Teiler gcd(a, b) zweiernatürlicher Zahlen a und b
basiert auf folgender mathematischen Rekursion (Beweis imSkript):
gcd(a, b) =
{a, falls b = 0
gcd(b, a mod b), andernfalls
464
![Page 89: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/89.jpg)
Euklidischer Algorithmus in C++
gcd(a, b) =
{a, falls b = 0
gcd(b, a mod b), andernfalls
unsigned int gcd(unsigned int a, unsigned int b) {if (b == 0)
return a;else
return gcd(b, a % b);}
465
![Page 90: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/90.jpg)
Euklidischer Algorithmus in C++
gcd(a, b) =
{a, falls b = 0
gcd(b, a mod b), andernfalls
unsigned int gcd(unsigned int a, unsigned int b) {if (b == 0)
return a;else
return gcd(b, a % b);}
Terminierung: a mod b < b, alsowird b in jedem rekursiven Aufrufkleiner.
465
![Page 91: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/91.jpg)
Fibonacci-Zahlen
Fn :=
0, falls n = 0
1, falls n = 1
Fn−1 + Fn−2, falls n > 1
466
![Page 92: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/92.jpg)
Fibonacci-Zahlen
Fn :=
0, falls n = 0
1, falls n = 1
Fn−1 + Fn−2, falls n > 1
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 . . .466
![Page 93: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/93.jpg)
Fibonacci-Zahlen in Zurich
467
![Page 94: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/94.jpg)
Fibonacci-Zahlen in C++
Fn :=
0, falls n = 0
1, falls n = 1
Fn−1 + Fn−2, falls n > 1
unsigned int fib(unsigned int n) {if (n == 0) return 0;if (n == 1) return 1;return fib(n-1) + fib(n-2); // n > 1
}468
![Page 95: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/95.jpg)
Fibonacci-Zahlen in C++
Fn :=
0, falls n = 0
1, falls n = 1
Fn−1 + Fn−2, falls n > 1
unsigned int fib(unsigned int n) {if (n == 0) return 0;if (n == 1) return 1;return fib(n-1) + fib(n-2); // n > 1
}468
![Page 96: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/96.jpg)
Fibonacci-Zahlen in C++
Laufzeit
fib(50) dauert „ewig“, denn es berechnetF48 2-mal, F47 3-mal, F46 5-mal, F45 8-mal, F44 13-mal,F43 21-mal ... F1 ca. 109 mal (!)
unsigned int fib(unsigned int n) {if (n == 0) return 0;if (n == 1) return 1;return fib(n-1) + fib(n-2); // n > 1
}
468
![Page 97: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/97.jpg)
Schnelle Fibonacci-Zahlen
Idee:
Berechne jede Fibonacci-Zahl nur einmal, in der ReihenfolgeF0, F1, F2, . . . , Fn
Speichere jeweils die zwei letzten berechneten Fibonacci-Zahlen(Variablen a und b)Berechne die nächste Zahl als Summe von a und b
Kann rekursiv und iterativ implementiert werden, letzteres ist einfacher/direkter
469
![Page 98: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/98.jpg)
Schnelle Fibonacci-Zahlen
Idee:
Berechne jede Fibonacci-Zahl nur einmal, in der ReihenfolgeF0, F1, F2, . . . , Fn
Speichere jeweils die zwei letzten berechneten Fibonacci-Zahlen(Variablen a und b)
Berechne die nächste Zahl als Summe von a und b
Kann rekursiv und iterativ implementiert werden, letzteres ist einfacher/direkter
469
![Page 99: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/99.jpg)
Schnelle Fibonacci-Zahlen
Idee:
Berechne jede Fibonacci-Zahl nur einmal, in der ReihenfolgeF0, F1, F2, . . . , Fn
Speichere jeweils die zwei letzten berechneten Fibonacci-Zahlen(Variablen a und b)Berechne die nächste Zahl als Summe von a und b
Kann rekursiv und iterativ implementiert werden, letzteres ist einfacher/direkter
469
![Page 100: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/100.jpg)
Schnelle Fibonacci-Zahlen
Idee:
Berechne jede Fibonacci-Zahl nur einmal, in der ReihenfolgeF0, F1, F2, . . . , Fn
Speichere jeweils die zwei letzten berechneten Fibonacci-Zahlen(Variablen a und b)Berechne die nächste Zahl als Summe von a und b
Kann rekursiv und iterativ implementiert werden, letzteres ist einfacher/direkter
469
![Page 101: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/101.jpg)
Schnelle Fibonacci-Zahlen in C++
unsigned int fib(unsigned int n) {if (n == 0) return 0;if (n == 1) return 1;unsigned int a = 0; // F_0unsigned int b = 1; // F_1for (unsigned int i = 2; i <= n; ++i){
unsigned int a_old = a; // F_i-2a = b; // F_i-1b += a_old; // F_i-1 += F_i-2 -> F_i
}return b;
}
(Fi−2, Fi−1) −→ (Fi−1, Fi)
a b470
![Page 102: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/102.jpg)
Schnelle Fibonacci-Zahlen in C++
unsigned int fib(unsigned int n) {if (n == 0) return 0;if (n == 1) return 1;unsigned int a = 0; // F_0unsigned int b = 1; // F_1for (unsigned int i = 2; i <= n; ++i){
unsigned int a_old = a; // F_i-2a = b; // F_i-1b += a_old; // F_i-1 += F_i-2 -> F_i
}return b;
}
(Fi−2, Fi−1) −→ (Fi−1, Fi)
a b470
![Page 103: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/103.jpg)
Schnelle Fibonacci-Zahlen in C++
unsigned int fib(unsigned int n) {if (n == 0) return 0;if (n == 1) return 1;unsigned int a = 0; // F_0unsigned int b = 1; // F_1for (unsigned int i = 2; i <= n; ++i){
unsigned int a_old = a; // F_i-2a = b; // F_i-1b += a_old; // F_i-1 += F_i-2 -> F_i
}return b;
}
(Fi−2, Fi−1) −→ (Fi−1, Fi)
a b470
![Page 104: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/104.jpg)
Schnelle Fibonacci-Zahlen in C++
unsigned int fib(unsigned int n) {if (n == 0) return 0;if (n == 1) return 1;unsigned int a = 0; // F_0unsigned int b = 1; // F_1for (unsigned int i = 2; i <= n; ++i){
unsigned int a_old = a; // F_i-2a = b; // F_i-1b += a_old; // F_i-1 += F_i-2 -> F_i
}return b;
}
(Fi−2, Fi−1) −→ (Fi−1, Fi)
a b
sehr schnell auch bei fib(50)
470
![Page 105: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/105.jpg)
Die Macht der Rekursion
Einige Probleme scheinen ohne Rekursion kaum lösbar zu sein.Mit Rekursion werden sie plötzlich deutlich einfacher lösbar.Beispiele: das n-Damen-Problem, Die Türme von Hanoi, Parsenvon Ausdrücken, Sudoku-Löser, Umgekehrte Aus- oder Eingabe,Suchen in Bäumen, Divide-And-Conquer (z.B. Sortieren)
471
![Page 106: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/106.jpg)
Das n-Damen Problem
Gegeben sei ein n× n SchachbrettZum Beispiel n = 6
Frage: ist es möglich n Damen sozu platzieren, dass keine zweiDamen sich bedrohen?
Wenn ja, wie viele Lösungen gibtes?
472
![Page 107: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/107.jpg)
Das n-Damen Problem
Gegeben sei ein n× n SchachbrettZum Beispiel n = 6
Frage: ist es möglich n Damen sozu platzieren, dass keine zweiDamen sich bedrohen?
Wenn ja, wie viele Lösungen gibtes?
472
![Page 108: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/108.jpg)
Das n-Damen Problem
Gegeben sei ein n× n SchachbrettZum Beispiel n = 6
Frage: ist es möglich n Damen sozu platzieren, dass keine zweiDamen sich bedrohen?
Wenn ja, wie viele Lösungen gibtes?
472
![Page 109: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/109.jpg)
Das n-Damen Problem
Gegeben sei ein n× n SchachbrettZum Beispiel n = 6
Frage: ist es möglich n Damen sozu platzieren, dass keine zweiDamen sich bedrohen?Wenn ja, wie viele Lösungen gibtes?
472
![Page 110: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/110.jpg)
Losung?
Durchprobieren aller Möglichkeiten?
(n2
n
)Möglichkeiten. Zu viele!
Nur eine Dame pro Zeile: nn Möglichkeiten. Besser – aber auchnoch zu viele.Idee: Unsinnige Versuche gar nicht erst weiterverfolgen,stattdessen falsche Züge zurücknehmen⇒ Backtracking
473
![Page 111: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/111.jpg)
Losung?
Durchprobieren aller Möglichkeiten?(n2
n
)Möglichkeiten. Zu viele!
Nur eine Dame pro Zeile: nn Möglichkeiten. Besser – aber auchnoch zu viele.Idee: Unsinnige Versuche gar nicht erst weiterverfolgen,stattdessen falsche Züge zurücknehmen⇒ Backtracking
473
![Page 112: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/112.jpg)
Losung?
Durchprobieren aller Möglichkeiten?(n2
n
)Möglichkeiten. Zu viele!
Nur eine Dame pro Zeile: nn Möglichkeiten. Besser – aber auchnoch zu viele.
Idee: Unsinnige Versuche gar nicht erst weiterverfolgen,stattdessen falsche Züge zurücknehmen⇒ Backtracking
473
![Page 113: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/113.jpg)
Losung?
Durchprobieren aller Möglichkeiten?(n2
n
)Möglichkeiten. Zu viele!
Nur eine Dame pro Zeile: nn Möglichkeiten. Besser – aber auchnoch zu viele.Idee: Unsinnige Versuche gar nicht erst weiterverfolgen,stattdessen falsche Züge zurücknehmen⇒ Backtracking
473
![Page 114: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/114.jpg)
Losung mit Backtracking
Erste Dame
queens
0
0
0
0
474
![Page 115: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/115.jpg)
Losung mit Backtracking
xVerbotene Felder:hier dürfen keineanderen Damenstehen.
queens
0
0
0
0
474
![Page 116: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/116.jpg)
Losung mit Backtracking
x xVerbotene Felder:hier dürfen keineanderen Damenstehen.
queens
0
1
0
0
474
![Page 117: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/117.jpg)
Losung mit Backtracking
x xNächste Damein nächster Zeile(keine Kolli-sion)
queens
0
2
0
0
474
![Page 118: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/118.jpg)
Losung mit Backtracking
x x
x x x x
Alle Felder in näch-ster Zeile verboten.Zurück! (Backtrack-ing!)
queens
0
2
4
0
474
![Page 119: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/119.jpg)
Losung mit Backtracking
x x x Dame eins weitersetzen und wiederversuchen
queens
0
3
0
0
474
![Page 120: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/120.jpg)
Losung mit Backtracking
x x x
xNächste Zeile
queens
0
3
1
0
474
![Page 121: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/121.jpg)
Losung mit Backtracking
x x x
x
Ok (nur bereitsgesetzte Damenmüssen getestetwerden)
queens
0
3
1
0
474
![Page 122: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/122.jpg)
Losung mit Backtracking
x x x
x
x x x x
Alle Felder der näch-sten Zeile verboten.Zurück.
queens
0
3
1
4
474
![Page 123: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/123.jpg)
Losung mit Backtracking
x x x
x x
Weiter in der vorigenZeile
queens
0
3
1
0
474
![Page 124: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/124.jpg)
Losung mit Backtracking
x x x
x x x x
Alle restlichenFelder auch ver-boten. Weiterzurück (back-tracking)
queens
0
3
4
0
474
![Page 125: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/125.jpg)
Losung mit Backtracking
x x x x
Alle Felder dieserZeile führten zukeiner Lösung.Weiter zurück (back-tracking)
queens
0
4
0
0
474
![Page 126: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/126.jpg)
Losung mit Backtracking
x
Setze Dame wiedereins weiter.
queens
1
0
0
0
474
![Page 127: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/127.jpg)
Losung mit Backtracking
x
x x xnächste Zeile
queens
1
3
0
0
474
![Page 128: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/128.jpg)
Losung mit Backtracking
x
x x xnächste Zeile
queens
1
3
0
0
474
![Page 129: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/129.jpg)
Losung mit Backtracking
x
x x x
x x
nächste Zeile
queens
1
3
0
1
474
![Page 130: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/130.jpg)
Losung mit Backtracking
x
x x x
x x
Lösung gefunden
queens
1
3
0
2
474
![Page 131: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/131.jpg)
Suchstrategie als Baum visualisiert
475
![Page 132: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/132.jpg)
Suchstrategie als Baum visualisiert
x x
475
![Page 133: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/133.jpg)
Suchstrategie als Baum visualisiert
x x
x x x x
475
![Page 134: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/134.jpg)
Suchstrategie als Baum visualisiert
x x x
475
![Page 135: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/135.jpg)
Suchstrategie als Baum visualisiert
x x x
x
475
![Page 136: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/136.jpg)
Suchstrategie als Baum visualisiert
x x x
x
x x x x
475
![Page 137: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/137.jpg)
Suchstrategie als Baum visualisiert
x x x
x x
475
![Page 138: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/138.jpg)
Suchstrategie als Baum visualisiert
x x x
x x x x
475
![Page 139: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/139.jpg)
Suchstrategie als Baum visualisiert
x x x x
475
![Page 140: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/140.jpg)
Suchstrategie als Baum visualisiert
x
475
![Page 141: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/141.jpg)
Suchstrategie als Baum visualisiert
x
x x x
475
![Page 142: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/142.jpg)
Suchstrategie als Baum visualisiert
x
x x x
475
![Page 143: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/143.jpg)
Suchstrategie als Baum visualisiert
x
x x x
x x
475
![Page 144: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/144.jpg)
Suchstrategie als Baum visualisiert
x
x x x
x x
475
![Page 145: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/145.jpg)
Prufe Dameusing Queens = std::vector<unsigned int>;
// post: returns if queen in the given row is valid, i.e.// does not share a common row, column or diagonal// with any of the queens on rows 0 to row−1bool valid(const Queens& queens, unsigned int row) {
unsigned int col = queens[row];for (unsigned int r = 0; r != row; ++r) {
unsigned int c = queens[r];if (col == c || col − row == c − r || col + row == c + r)
return false; // same column or diagonal}return true; // no shared column or diagonal
}
476
![Page 146: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/146.jpg)
Rekursion: Finde eine Losung// pre: all queens from row 0 to row−1 are valid,// i.e. do not share any common row, column or diagonal// post: returns if there is a valid position for queens on// row .. queens.size(). if true is returned then the// queens vector contains a valid configuration.bool solve(Queens& queens, unsigned int row) {
if (row == queens.size())return true;
for (unsigned int col = 0; col != queens.size(); ++col) {queens[row] = col;if (valid(queens, row) && solve(queens,row+1))
return true; // (else check next position)}return false; // no valid configuration found
}477
![Page 147: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/147.jpg)
Rekursion: Zahle alle Losungen// pre: all queens from row 0 to row−1 are valid,// i.e. do not share any common row, column or diagonal// post: returns the number of valid configurations of the// remaining queens on rows row ... queens.size()int nSolutions(Queens& queens, unsigned int row) {
if (row == queens.size())return 1;
int count = 0;for (unsigned int col = 0; col != queens.size(); ++col) {
queens[row] = col;if (valid(queens, row))
count += nSolutions(queens,row+1);}return count;
}478
![Page 148: 14. Zeichen und Texte II - lec.inf.ethz.chlec.inf.ethz.ch/mavt/informatik/2019/slides/lecture8.pdf · 14. Zeichen und Texte II Caesar-Code mit Streams, Texte als Strings, String-Operationen](https://reader030.vdocuments.site/reader030/viewer/2022040705/5e041bfe18c11005f73e7e3d/html5/thumbnails/148.jpg)
Hauptprogramm// pre: positions of the queens in vector queens// post: output of the positions of the queens in a graphical wayvoid print(const Queens& queens);
int main() {int n;std::cin >> n;Queens queens(n);if (solve(queens,0)) {
print(queens);std::cout << "# solutions:" << nSolutions(queens,0) << std::endl;
} elsestd::cout << "no solution" << std::endl;
return 0;}
479