Aufgaben

Aufgabe: Termdarstellungen berechnen

Hinweis: Um zu testen, ob ein in einer Variablen term gespeicherter Wert eine Liste ist, können Sie die folgende Notation verwenden: type(term)==list liefert True zurück, wenn term eine Liste ist und ansonsten False.

Definieren Sie drei Python-Funktionen zur Darstellung von Termen. Als Eingabe sollen alle Funktionen Terme erwarten, die als geschachtelte Listen dargestellt sind. Diese Darstellung der Eingabe lässt sich am einfachsten anhand eines Beispiels verdeutlichen. Der Term ((4-2)+((1/2)*3)) wird durch die folgende Liste dargestellt:

term = ["+", ["-", 4, 2], ["*", ["/", 1, 2], 3]]

Jeder Term ist also entweder eine dreielementige Liste oder eine Zahl. Im Fall komplexer Terme ist das erste Listen-Element eine Zeichenkette, die eine binäre Rechenoperation beschreibt. Das zweite und dritte Listen-Element sind jeweils Terme, die die beiden Argumente der Operation darstellen.

Definieren Sie eine Funktion infix, die die geklammerte Infixdarstellung eines so dargestellten Terms als Zeichenkette zurückgibt. Zum Beispiel soll infix(term) mit der obigen Definition für term die vorher gezeigte Infixdarstellung berechnen.

Definieren Sie Funktionen prefix und postfix, die entsprechend die Präfix- und Postfix-Darstellung eines Terms berechnen. Diese Funktionen erwarten wie infix einen als geschachtelte Liste dargestellten Term als Argument, sollen aber keine Zeichenkette sondern eine (nicht geschachteltes) Liste zurückliefern, wie die folgenden Aufrufe zeigen.

>>> prefix(term)
 ["+", "-", 4, 2, "*", "/", 1, 2, 3]
>>> postfix(term)
 [4, 2, "-", 1, 2, "/", 3, "*", "+"]

Aufgabe: Terme rekursiv auswerten

Definieren Sie eine rekursive python-Funktion eval_expr, die eine als Liste dargestellten arithmetischen Ausdruck der Form ["+", ["-", 4, 2], ["*", ["/", 1, 2], 3]] als Argument erwartet und als Ergebnis den Wert des Ausdrucks zurückliefert. Jeder Ausdruck ist also entweder eine dreielementige Liste oder eine Zahl. Im Fall komplexer Ausdrücke ist das erste Listen-Element eine Zeichenkette, die eine binäre Rechenoperation beschreibt. Das zweite und dritte Listen-Element sind jeweils Ausdrücke, die die beiden Argumente der Operation darstellen.

Für den gezeigten Ausdruck soll die Funktion 3.5 zurückliefern.

Hinweis: Um zu testen, ob ein in einer Variablen expr gespeicherter Wert eine Liste ist, können Sie die folgende Notation verwenden: type(expr)==list liefert True zurück, wenn expr eine Liste ist und ansonsten False.