Vorlesung PRG-1, WS05/06

Werbung
Fachbereich Informatik & Mathematik (12)
Professur für Graphische Datenverarbeitung
Prof. Dr. Detlef Krömker
Ashraf Abu Baker
Varrentrappstr. 40-42
60486 Frankfurt am Main
Tel.: +49 (0)69798-24600
Fax: +49 (0)69798-24603
EMail: [email protected]
Aufgabe 5.1: (continue, break, Datenstrukturen)
a) (1 Punkt) continue
Programme, die unnötige Rechenoperationen durchführen, werden als ineffizient bezeichnet.
Skript3 aus Aufgabe 4.3.c des 4. Übungsblattes ist deshalb ineffizient, weil die Summe in der
inneren Schleife bei jedem Durchlauf der äußeren Schleife erneut gebildet wird, was ja nicht nötig
ist. Effizienter wäre es, wenn die innere Schleife nur einmal die Summe berechnen und das
Ergebnis in einer Variable s speichern würde.
Die äußere Schleife soll nun mit Hilfe einer booleschen Variable b erkennen, ob die innere
Schleife schon mal durchgelaufen ist. Ist das der Fall, so greift sie auf den in s gespeicherten Wert
zu.
Verbessern Sie Skript3 so, dass die Summe wie oben beschrieben nur einmal berechnet wird. Die
Verschachtelung der beiden Schleifen muss bestehen bleiben.
Ist das Skript jetzt effizient? Begründen Sie kurz Ihre Antwort!
Hinweis: continue
(0,5 Punkte) break
Nun soll davon ausgegangen werden, dass die Liste L2 unsortiert ist und sowohl positive als auch
negative Zahlen enthält. Statt die Summe aller Zahlen zu bilden, soll nun nur die Summe der
Zahlen gebildet werden, welche vor der ersten negativen Zahl in der Liste stehen. Mit anderen
Worten: Steht die erste negative Zahl an Index i, so enthält die Summe s nur noch die Elemente
L2[0]+L2[1]+...+L2[i-1]. Beachten Sie, dass die Summe hierbei nur noch positive Zahlen enthält.
Hinweis: break
b) (1 Punkt) Tupel (tuples)
Vervollständigen Sie die unten stehende Tabelle nach Ausführung des folgenden Skriptes:
[Skript-Anfang]
S="A string is an immutable ordered sequence of characters"
L="A list is a mutable ordered sequence of items"
T="A tuple is an immutable ordered sequence of items"
I="An item can be a number, a string, a data structure or an object"
n=5
T1=5,
T2=tuple(["c",T1])
Liste=list(L[2:4])
Liste=Liste+["st",["e"]]
T3=(n,T1, Liste,T[:len(T)/2])
T4=7,tuple(T1),(),T[0:3]
[Skript-Ende]
Ausdruck
Wert des Ausdrucks
Typ des Ausdrucks
T3[1:1]
T4[0]*T3[1][0]
tuple(T3[2])
2*T3[2][3][0]
(T4[1],Liste[3][0])
Begründen Sie kurz warum die folgenden Anweisungen unzulässig sind:
T2[0]="c"
T4[0]=T1[0]
Bemerkung: Wir empfehlen, die Aufgabe (zuerst) durch Überlegen zu lösen und nicht gleich den Interpreter zu benutzen. Das
könnte in einer Klausur sehr hilfreich sein.
c) (1 Punkt) Mengen (sets)
A, B, C, D und E sind im folgenden Skript Mengen.
[Skript-Anfang]
S="A set is a mutable unordered collection of unique items"
A= set(tuple("hello"))
h=3
B=set("2*h-1")
C=set(list([1,-1]))
D= set([1-len(C)])
E=A^B
[Skript-Ende]
Schreiben Sie ein einfaches übersichtliches Python-Skript das die folgenden Mengenoperationen
durchführt und die Ergebnisse auf dem Bildschirm ausgibt:
M1 = A ∪ B
M2 = C ∩ D
M3 = B \ C
M 4 = E \ ((A ∪ B) \ (A ∩ B))
M5 = Potenzmenge(C)
M6 = Komplementmenge von D bezüglich der Grundmenge C.
Begründen Sie kurz warum die folgende Anweisung fehlerhaft ist:
print 3*A[0]
d) (1 Punkt) Dictionaries
[Skript-Anfang]
D="A dictionary is a mutable unordered collection of key/item pairs"
DS="Lists, sets, tuples, dictionaries, queues and stacks are data structures"
dic={"1":"k","b":5,2:dict([tuple((-1,""))]),"3":4}
[Skript-Ende]
Welchen Wert gibt die Anweisung print dic[dic["3"]/2][-1*dic["b"]/5] auf dem Bildschirm aus?
Begründen Sie Ihre Antwort!
Begründen Sie kurz warum die folgende Anweisung unzulässig ist:
print "o"+dic[1],
Aufgabe 5.2: (Funktionen)
a) (1 Punkt) (formale Parameter)
Nennen Sie den Unterschied zwischen den obligatorischen (mandatory) und den optionalen
(optional, default) Parametern bei Funktionsaufrufen in Python. Wie oft werden die optionalen
Parameter evaluiert?
Hinweise zur dieser Aufgabe erhalten Sie von Ihrem Tutor.
b) (1,5 Punkte) (call-by-value, call-by-reference)
Was versteht man unter call-by-value und call-by-reference beim Aufruf einer Funktion
(Prozedur, Methode) in einer Programmiersprache?
Was ist eine Referenz?
Welche Arten der Parameterübergabe kennt Python?
c) (1 Punkt)
Gegeben sei das folgende Skript:
[Skript-Anfang]
x=10
L=list(xrange(x))
def f(x,z):
x=x-1# change x
del z[x]# change z
print "value of x before calling f: ",x
print "value of L before calling f: ",L
f(x,L)
print "value of x after calling f: ",x
print "value of L after calling f: ",L
[Skript-Ende]
Erläutern Sie, warum eine Veränderung von z im Funktionsrumpf eine Veränderung von L
impliziert, während eine Veränderung von x im Funktionsrumpf keinerlei Wirkung auf x
außerhalb der Funktion hat.
d) (1,5 Punkte) Positionsargumente (positional arguments), Schlüsselargumente (keyword arguments)
Was sind Positions- und Schlüsselargumente einer Funktion, woran erkennt man sie, in welcher
Reihenfolge kommen sie im Funktionskopf und in welchen Datenstrukturen werden sie
übergeben?
Geben Sie ein einfaches Beispiel für eine Funktion, welche sowohl Positions- als auch
Schlüsselargumente übergeben bekommt. Die Funktion soll alle übergebenen Parameter mit einer
print-Anweisung auf dem Bildschirm ausgeben.
Hinweis: siehe Python-Tutorial Abschnitt 4.7.2
Aufgabe 5.3: (Rekursion)
a) (1,5 Punkt) Rekursionstiefe
Was ist der Unterschied zwischen rekursiven und iterativen Programmen? Stellen Sie sie
gegenüber und nennen Sie ihre Vor- und Nachteile!
Wie groß ist die maximale Rekursionstiefe einer rekursiven Funktion in Python? Mit anderen
Worten: Wie oft darf sich eine rekursive Funktion in Python aufrufen?
b) (1 Punkt) ggt
Der euklidische Algorithmus ist ein rekursives Verfahren zur Bestimmung des größten
gemeinsamen Teilers (ggT) zweier natürlicher Zahlen a und b.
Er lässt sich wie folgt formulieren:
ggt(a,b):
Schritt1: wenn b = 0, dann ist a=ggt(a,b), gebe a aus, Ende, sonst gehe zu Schrit2
Schritt2: a=b, b= a modulo b, gehe zu Schritt1.
a modulo b ist dabei der Rest der ganzzahligen Division von a durch b.
Schreiben Sie eine rekursive Funktion zur Bestimmung des größten gemeinsamen Teilers zweier
natürlichen Zahlen.
c) (1,5 Punkte) rekursive Zahlenfolgen
Gegeben sei die folgende, auf natürliche Zahlen rekursiv definierte Zahlenfolge:
0, wenn n = 0
a ( n) =
2 , wenn n = 1
n
n +1
), sonst
0,4 * a (
) + 0,7 * a (
4
2
Schreiben Sie eine rekursive Funktion, welche die Elemente von a für ein gegebenes n berechnet
und auf dem Bildschirm durch Komma getrennt ausgibt.
Zeichnen Sie für n=3 den zugehörigen Rekursionsbaum.
d) (1,5 Punkte) Binomialkoeffizient
n
Der k-te Binomialkoeffizient
der binomischen Formel (a + b) n kann sowohl iterativ als auch
k
rekursiv wie folgt definiert werden:
n
n!
=
Iterativ:
k
k!(n − k )!
1, wenn k = 0 oder n = k
n
n −1
Rekursiv:
= n −1
+
, sonst
k
k
k −1
Implementieren Sie die rekursive Variante als Python-Funktion.
Aufgabe 5.4: Lerngruppenaufgabe (Module)
a) (0,5 Punkte) Importieren von Modulen
Was sind Module in Python? Sie haben Ihre Module irgendwo in Ihrem Rechner gespeichert.
Was müssen Sie nun tun, damit die Python-Umgebung beim Importieren der von Ihnen erstellten
Module sie findet und lädt?
b) (1,5 Punkte) Modul matrix
Erstellen Sie ein Python-Modul namens matrix. Das Modul soll zwei Funktion transpose(A) und
mult(A,B,C) zur Verfügung stellen. transpose bekommt eine Matrix Amxk und liefert die
transponierte Matrix von A zurück. mult erhält als Eingabe drei Matrizen Amxk , Bkxn und Cmxn ,
bildet das Produkt von Amxk und Bkxn , schreibt das Ergebnis in Cmxn und liefert Cmxn als
Rückgabewert zurück.
c) (3 Punkte) Modul converter
Schreiben Sie ein zweites möglichst effizientes Modul namens converter. Das Modul soll eine
Funktion convert(number, base1, base2) zur Verfügung stellen, welche eine natürliche Zahl zur
Basis base1 bekommt und sie in eine Zahl zur Basis base2 konvertiert und zurückgibt.
Das Modul soll u. a. eine Hilfsfunktion checkSyntax(number, base1, base2) implementieren, die
sicherstellt, dass base1 und base2 unterschiedliche Zahlen zwischen 2 und 16 sind und, dass
number tatsächlich eine Zahl zur Basis base1 ist. Die Zahl muss nicht immer zunächst in eine
Dezimalzahl und anschließend in eine Zahl zur gegebenen Basis konvertiert werden. Die direkte
Konvertierung soll u. Umständen möglich sein.
Hinweis: Zur Implementierung, siehe Aufgabe 2.3 des zweiten Übungsblatts.
Herunterladen