Rekursion
Rekursion¶
Rekursive Funktion Code und Bild:¶
import ozobot
"""
Ozobot demonstrates a Depth First traversal while navigating a binary tree maze.
Prerequisite: print or draw the map at https://ozoblockly.com/resource/maps/tree-maze-letter.pdf
Note: There is a bug in latest Evo FW with intersection detection on thick lines. As a workaround, make sure the line width is
exactly 4mm. This can be achieved by printing the track in 80% scale.
Start Ozobot Evo at the root of the tree and it will methodically explore all of the tree branches
and return to the starting point. Then the program will report the number of leaves
Ozobot visited while traversing the maze.
"""
robot = ozobot.get_robot()
def searchSubtree(intersection):
"""Depth First traversal in a binary tree"""
if (intersection == ozobot.Directions.BACK.value):
# Robot keeps track of visited leaves (line ends)
robot.navigation.navigate(ozobot.Directions.BACK)
return 1
else:
# currently, the algorithm only supports intersections of type "T", as in the example maze
intersection = robot.navigation.navigate(ozobot.Directions.RIGHT)
leaves_right = searchSubtree(intersection) # recursive call
intersection = robot.navigation.navigate(ozobot.Directions.FORWARD)
leaves_left = searchSubtree(intersection)
robot.navigation.navigate(ozobot.Directions.RIGHT)
return leaves_left + leaves_right
intersection = robot.navigation.navigate(ozobot.Directions.FORWARD)
searchSubtree(intersection) # when complete, returns the number of leaves as Result
Was sind rekursive Funktionen? Was ist der Sinn?¶
Rekursive Funktionen rufen sich selbst auf, um ein Problem schrittweise in kleinere Teile zu zerlegen, bis ein Basisfall erreicht ist. Dies ist hilfreich bei Aufgaben, die sich in ähnlichen Schritten wiederholen oder wie ein Baum verzweigen (z. B. für Berechnungen wie Fakultät oder Fibonacci-Folge).
Code-Beispiel Ozobot mit Erklärung?¶
def spirale(stufen, distanz):
if stufen > 0: # Basisfall: Wenn keine Stufen mehr übrig, stoppt die Funktion
ozobot.vor(distanz) # Bewegt den Ozobot um 'distanz' nach vorne
ozobot.drehe(30) # Dreht Ozobot um 30 Grad
spirale(stufen - 1, distanz + 5) # Ruft sich selbst auf, erhöht die Distanz
Erklärung:¶
- Parameter
stufengibt die Anzahl der Wiederholungen an und dient als Abbruchbedingung. Wennstufenauf 0 sinkt, endet die Rekursion. - Parameter
distanzbestimmt, wie weit sich der Ozobot bewegt. Bei jedem Aufruf wird diedistanzum 5 Einheiten erhöht, was eine Spirale erzeugt. - Selbstaufruf: Die Funktion
spiraleruft sich mitstufen - 1unddistanz + 5selbst auf, wodurch eine größere Bewegung und eine Wiederholung mit reduziertemstufenerfolgt.
Eigene Rekursive Funktion mit Erklärung:¶
def sum_numbers(n):
if n == 0:
return 0 # Basisfall: Summe von 0 ist 0
else:
return n + sum_numbers(n - 1) # Rekursiver Aufruf
# Beispielaufruf
n = 5 # Beispielwert
result = sum_numbers(n) # Summe der ersten n Zahlen
print("Die Summe der ersten", n, "Zahlen ist:", result) # Ausgabe: 15
Erklärung:
- Funktion
**sum_numbers(n)**: - Berechnet die Summe der ersten
nZahlen. - Basisfall: Wenn
ngleich0ist, gibt die Funktion0zurück (Summe von 0). - Rekursiver Schritt: Wenn
nnicht0ist, wirdnzur Summe der vorherigen Zahlen (sum_numbers(n - 1)) addiert. - Beispielaufruf:
n = 5: Setzt den Wert auf5.result = sum_numbers(n): Ruft die Funktion auf und speichert das Ergebnis.- Die Ausgabe zeigt die Summe der ersten
5Zahlen (1 + 2 + 3 + 4 + 5), die15beträgt.
Funktionsweise der Rekursion¶
- Die Funktion ruft sich selbst auf, bis
ngleich0ist. - Bei jedem Aufruf wird der aktuelle Wert von
nzur Summe hinzugefügt. - Nach Erreichen des Basisfalls werden die Ergebnisse zurückgegeben, und die Rekursion löst sich auf.
Eigenes Programm mit Ozocard:¶
Code zu unserem Programm
def temperatur_anzeige(temperatur): # Funktion receives temperatur as an argument
drawText(10, 80, "Es ist " + (temperatur) + " Grad\n warm")
while true:
clear()
temperatur = getTemperature()
if getButton() == 2:
if temperatur > -100: # Check if the temperature is valid
if temperatur >=20:
background(255, 0, 0)
temperatur_anzeige(temperatur)
else:
background(0, 0, 255)
temperatur_anzeige(temperatur)
else:
print("Temperatur konnte nicht abgerufen werden")
else:
drawText(10, 90, "Funktion\nwählen")
drawText(10, 200, "oben = temp")
update()
Hiermit wird die aktuelle Temperatur angezeit auf dem Bildschirm wenn man die obere Taste drückt. In unserem Programm gibt es die Möglichkeit das wenn die Temperatur unter 20 fällt dass der Bildschirm blau wird und wenn er oberhalb von 20 ist ist der Hintergrund rot.
Wir wollten jede Funktion in das Programm einbauen haben dies jedoch aus zeitlich Gründen nicht geschaft:)
Bilder wie der Code ausgeführt wird:
