Kontrollfluss: Bedingungen und Schleifen
Die einzigen zwei Züge, die ein Programm hat: mit boolescher Algebra einen Weg wählen und einen Weg wiederholen, bis die Daten oder die Bedingung Stopp sagen.
Ein Programm, das nur Werte speichert, tut nichts. Nützlich wird es in dem Moment, in dem es zu wählen beginnt: Wenn der Warenkorb leer ist, zeige die leere Meldung; für jede Zeile in der Datei addiere den Preis. Das sind die einzigen zwei Züge, die ein Programm hat. Bedingungen wählen einen Weg. Schleifen wiederholen einen Weg. Jeder Algorithmus, den du je schreiben wirst, besteht aus diesen zwei Zügen, ineinander verschachtelt.
In logic:1 hast du Ausdrücke geschrieben wie not paid, paid and age >= 18, paid or free. Damals waren sie abstrakt. Im Code sind es genau dieselben Ausdrücke, und if ist die Maschine, die einen davon in eine Handlung verwandelt.
logic:1 code
not paid --> !paid
paid and age >= 18 --> paid && age >= 18
paid or free --> paid || free
if (paid && age >= 18) { ... }Dieselbe boolesche Algebra, zwei Schreibweisen. Die Namen der Operatoren ändern sich, die Wahrheitstabellen nicht.Hier ist dieselbe Entscheidung in allen drei Sprachen: Ist diese Person erwachsen?
if age >= 18:
label = "adult"
else:
label = "minor"Python: ein Doppelpunkt und Einrückung statt geschweifter Klammern.let label;
if (age >= 18) {
label = "adult";
} else {
label = "minor";
}JavaScript: geschweifte Klammern um den Rumpf, Semikolons am Ende.var label string
if age >= 18 {
label = "adult"
} else {
label = "minor"
}Go: geschweifte Klammern, und die Bedingung steht ohne runde Klammern da.Schleifen gibt es in zwei Sorten, und die richtige zu wählen ist fast die ganze Kunst. Eine for-Schleife wiederholt sich einmal pro Element einer bekannten Sammlung, und etwas anderes entscheidet, wann sie stoppt. Eine while-Schleife wiederholt sich, solange eine Bedingung true bleibt, und du entscheidest, wann sie stoppt, indem du im Rumpf etwas änderst.
for item in list: once per item, list decides how many
while needed: while the condition stays true, repeat
for i in range(3): 3 rounds
while retries < 3: up to 3 rounds, or fewer if it succeeds earlyEine for-Schleife zählt ab, was sie bekommen hat. Eine while-Schleife zählt selbst und kann sich dabei vertun.Dieselbe for-Schleife in drei Sprachen: eine Liste von scores zusammenzählen.
total = 0
for score in scores:
total = total + scorePython: for direkt über die Liste, kein Index nötig.let total = 0;
for (const score of scores) {
total = total + score;
}JavaScript: for of läuft über die Werte, nicht über die Positionen.total := 0
for _, score := range scores {
total = total + score
}Go: range liefert Position und Wert, und Go besteht darauf, dass du beides auch benutzt.Jetzt die Schleife, die nie endet, und warum das passiert. Eine while-Schleife wiederholt sich, solange eine Bedingung true ist. Die Bedingung wird zu Beginn jeder Runde geprüft. Wenn im Rumpf nichts jemals das ändert, was die Bedingung prüft, bleibt die Bedingung für immer true und die Schleife läuft für immer. Das Programm ist nicht kaputt. Es tut treu und brav genau das, was ihm gesagt wurde, bis du den Tab schließt.
while retries < 3:
print("trying")
trying
trying
trying
... and the tab never comes backDie Bedingung retries < 3 ist in der ersten Runde true. Im Rumpf ändert nichts jemals retries, also ist sie auch in der millionsten Runde noch true.Erinnere dich an Big-O aus logic:1: Zähle die Schritte in Abhängigkeit davon, wie viele Daten es gibt, und ignoriere, ob die Maschine schnell ist. Bei einer Schleife ist diese Zählung am leichtesten zu sehen, denn eine Schleife über n Elemente führt ihren Rumpf n-mal aus.
for x in list: work * n O(n)
for i in range(n):
for j in range(n): work * n * n O(n^2)
n = 1000 O(n) ~1000 steps
O(n^2) ~1000000 stepsEine Schleife, n Runden. Eine Schleife in einer Schleife, n mal n Runden.Praxis
Sieh dir die Schleife an. Welchen Wert hat total, nachdem sie fertig ist?
Hinweise
- Rechne jede Runde auf Papier durch: Was ist total vor der Runde, und was wird daraus.
- Die Schleife läuft nicht, wenn die Bedingung schon vor der ersten Runde false ist — prüf also den Startwert.
Hier ist eine while-Schleife, die von drei herunterzählt. Bringe die Runden in die Reihenfolge, in der sie geschehen, und ende mit dem Moment, in dem die Schleife stoppt.
- 1Die Bedingung in der nächsten Runde erneut prüfen
- 2Die Schleife verlassen und mit der nächsten Zeile des Programms fortfahren
- 3Den Rumpf ausführen: n ausgeben und eins von n abziehen
- 4Die Bedingung n > 0 prüfen und wahr vorfinden
- 5Die Bedingung prüfen und falsch vorfinden, weil n bei 0 angekommen ist
Hinweise
- Im Rumpf der Schleife ändert sich nichts: Dieselben wenigen Schritte wiederholen sich, und nur einer davon ändert die Antwort.
- Eine Schleife stoppt, weil die Bedingung falsch wird, und falsch kann sie nur werden, wenn etwas in der Schleife sie verschiebt.
Ordne jedem Code-Stück zu, wie seine Kosten wachsen, wenn die Daten wachsen. Das ist die Big-O-Idee aus logic:1, gesehen von innerhalb der Schleife.
Hinweise
- Vergleiche die Form des Wachstums, nicht die genaue Zahl der Schritte: Eine zusätzliche Zeile kann eine zusätzliche Runde bedeuten oder n zusätzliche Runden.
- Zwei verschachtelte Schleifen über dieselbe Liste multiplizieren sich, sie addieren sich nicht.