Aufgaben

Aufgabe: Termdarstellungen berechnen

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

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

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

Jeder Term ist also entweder ein dreielementiges Array oder eine Zahl. Im Fall komplexer Terme ist das erste Array-Element eine Zeichenkette, die eine binäre Rechenoperation beschreibt. Das zweite und dritte Array-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 geschachteltes Array dargestellten Term als Argument, sollen aber keine Zeichenkette sondern ein (nicht geschachteltes) Array 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 einen als Array 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 ein dreielementiges Array oder eine Zahl. Im Fall komplexer Ausdrücke ist das erste Array-Element eine Zeichenkette, die eine binäre Rechenoperation beschreibt. Das zweite und dritte Array-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 ein Array ist, können Sie die folgende Notation verwenden: type(expr)==list liefert True zurück, wenn expr ein Array ist und ansonsten False.