Zum Inhalt

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:

  1. Parameter stufen gibt die Anzahl der Wiederholungen an und dient als Abbruchbedingung. Wenn stufen auf 0 sinkt, endet die Rekursion.
  2. Parameter distanz bestimmt, wie weit sich der Ozobot bewegt. Bei jedem Aufruf wird die distanz um 5 Einheiten erhöht, was eine Spirale erzeugt.
  3. Selbstaufruf: Die Funktion spirale ruft sich mit stufen - 1 und distanz + 5 selbst auf, wodurch eine größere Bewegung und eine Wiederholung mit reduziertem stufen erfolgt.

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:

  1. Funktion **sum_numbers(n)**:
  2. Berechnet die Summe der ersten n Zahlen.
  3. Basisfall: Wenn n gleich 0 ist, gibt die Funktion 0 zurück (Summe von 0).
  4. Rekursiver Schritt: Wenn n nicht 0 ist, wird n zur Summe der vorherigen Zahlen (sum_numbers(n - 1)) addiert.
  5. Beispielaufruf:
  6. n = 5: Setzt den Wert auf 5.
  7. result = sum_numbers(n): Ruft die Funktion auf und speichert das Ergebnis.
  8. Die Ausgabe zeigt die Summe der ersten 5 Zahlen (1 + 2 + 3 + 4 + 5), die 15 beträgt.

Funktionsweise der Rekursion

  • Die Funktion ruft sich selbst auf, bis n gleich 0 ist.
  • Bei jedem Aufruf wird der aktuelle Wert von n zur 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:

IMG_2232.JPEG

IMG_2233.JPEG