Nichtprozedurale Programmierung

Werbung
Nichtprozedurale
Programmierung
Lösung - Hausaufgaben
Prof. Dr. rer. nat. habil. Klaus Mätzel
SS 2003
Autor Tobias Webelsiep
Stand: 6. Mai 2003
Inhaltsverzeichnis
1 Aufgabe
1.1 IDLE . . . . . . . . . . . . .
1.2 phyton.org . . . . . . . . . .
1.3 phyton.net . . . . . . . . . .
1.4 jython.org . . . . . . . . . .
1.5 Was sind Funktionen . . . .
1.6 Summe natürlicher Zahlen .
1.7 Produkt natürlicher Zahlen
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2 Aufgabe
2.1 Größter gemeinsamer Teiler . . . . . . . . . .
2.2 n-te Potenz . . . . . . . . . . . . . . . . . . .
2.3 Ganzzahlige Division . . . . . . . . . . . . . .
2.4 Restwertbestimmung bei ganzahliger Division
2.5 Das Newton’sche Iterationsverfahren . . . . .
3 Aufgabe
3.1 listmax . . . . . . . . . . . . . . . . .
3.2 Permutation . . . . . . . . . . . . . .
3.3 Pythogoräische Tripel . . . . . . . . .
3.4 Paarbildung . . . . . . . . . . . . . .
3.5 Matrizen-Rechnung . . . . . . . . . .
3.6 Varianzberechnung / Listensortierung
3.7 Modul: string . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
3
3
3
3
3
4
.
.
.
.
.
4
4
4
4
5
5
.
.
.
.
.
.
.
5
5
5
6
7
7
7
7
Aufgabe
1
1.1
Seite 3
Aufgabe
IDLE
Machen Sie sich mit dem Programm IDLE vertraut.
1.2
phyton.org
Überblick über das Angebot von http://www.python.org beschaffen, welche Literatur
gibt es?
1.3
phyton.net
Wenn Windows-Umbebung vorhanden:
http://starship.python.net und http://www.activestate.com analysieren
1.4
jython.org
Worüber informiert http://www.jython.org?
1.5
Was sind Funktionen
(a) Wie ist eine math. Funktion definiert?
D: Definitionsbereich (Menge)
W: Wertebereich (Menge)
Funktion: f : D → W , f : Abb. injektiv, d.h. für jedes x ∈ D gibt es ein y ∈ W
Beispiel: D : a, b ∈ {Interger}
S = divmod(a, b)
W : {(a, b)|a, b ∈ {Interger}}
(b) Was ist eine partielle Funktion?
Ein Funktion heißt Partiell wenn nicht für alle Elemente aus G gilt: f : D → W
1.6
Summe natürlicher Zahlen
Die Summe der Zahlen von 1, 2, ..., n kann durch die Formel n · (n + 1)/2 berechnet
werden.
(a) Beweis
1
2
3 ... n-2 n-1 n
+ n n-1 n-2 ... 3
2
1
===========================
n+1 n+1 n+1 ... n+1 n+1 n+1
⇒ 2 · (n + 1) ⇒ n · (n + 1)/2 = ist Summe der nautürlichen Zahlen bis n
Nichtprozedurale Programmierung
Tobias Webelsiep
Aufgabe
Seite 4
(b) Summe der geraden natürliche Zahlen
Leiten Sie ab, wie die Summe der geraden Zahlen 2,4,...,2m berechnet werden kann!
Menge der geraden Zahlen [0, 2, 4, 6, 8, ..., 2m]
⇒ sg = m ∗ (m + 1)
sg = lambda n: n/2 * (n/2 + 1)
1.7
Produkt natürlicher Zahlen
Welche formale Spezifikation kennen Sie für die für die Berechnung des Produktes der
Zahlen von 1 bis n ?
Fakultät:
2
n! = n · (n − 1)!
0! = 1
Aufgabe
2.1
Größter gemeinsamer Teiler
Was leistet die Funktion ggt?
ggt=lambda a,b:
(a==b and a) or
(a>b and ggt(a-b,b)) or
(b>a and ggt(a,b-a))
Die Funtion ggt berechnet den größten gemeinsamen Teiler der Übergabeparameter a
und b
2.2
n-te Potenz
Definieren Sie eine Funktion, die die n-te Potenz von x, x bel. Zahlobjekt, berechnet.
power=lambda x,n: (n==0 and 1) or
(n==1 and x) or
(x*power(x, n-1))
2.3
Ganzzahlige Division
Bestimmen Sie den ganzzzahligen Quotienten div(x,y) wobei x,y gegebene ganze positive Zahlen sind.
Hinweis: Zurückführung der Division auf niedere Operationen
div=lambda x,y: ((x>=y) and (1 + div(x-y, y)))
Anschaulich: ...((x<n) and 0) or (1 + div(x-n, n)) - geht nicht wegen 0-Rückgabe.
Nichtprozedurale Programmierung
Tobias Webelsiep
Aufgabe
2.4
Seite 5
Restwertbestimmung bei ganzahliger Division
Bestimmen Sie den ganzahligen Rest r(x,y) der bei der ganzzahligen Division div(x,y)
entsteht.
Hinweis: es gilt die Beziehung x=div(x,y)*y + rest(x,y)?
modulo = lambda x,y: ((x<y) and x) or ((x>y) and modulo(x-y, y))
2.5
Das Newton’sche Iterationsverfahren
Gegeben ist die positive Zahl a. Zur Berechnung von wurzel(a) soll das Newton’sche
Iterationsverfahren benutzt werden. Danach werden Näherungen
xn+1 = 1/2(xn + a/xn ) für n = 1, 2, 3, ...; x1 = 1
berechnet. Der Berechnungsprozeß kann beendet werden, wenn abs(xi*xi -a) < epsilon,
epsilon hinreichend klein, erfüllt ist. Definieren Sie einen Satz von Funktionen, so daß
wurzel(a) aufgerufen und ausgewertet werden kann, um die Wurzel von a zu berechnen.
Hinweis: Ermittle die notwendigen Funktionen aus der Analyse des vorgeschlagenen Verfahrens.
Lösung:
wurzel = lambda a: newton(float(a),1)
abs = lambda x: (x>0 and x) or (-1 * x)
newton = lambda a,x: ((abs((x*x) - a) < 0.00000000001) and x) or
(newton(a, (0.5*(x + (a/x)))))
Vergleiche das Ergebnis mit der Funktion sqrt aus dem Modul math. Was leistet die
Funktion pow?
Mit pow kann eine Zahl x mit n potenziert werden.
3
3.1
Aufgabe
listmax
Zu dem Vorlesungsbeispiel listmax ist eine Variante der akkumulativen Rekursion abzuleiten
3.2
Permutation
Eine Permutation von einer Liste von Zahlen ist eine Liste mit den selben Elementen in
unterschiedlicher Ordnung.
Nichtprozedurale Programmierung
Tobias Webelsiep
Aufgabe
Seite 6
perm([2, 3]) ==> [[2, 3], [3, 2]]
Definiere eine Funktion, die diese Permutationen berechnet.
Hinweis: Benutze die Funktion
dif=lambda l1,l2: [x for x in l1 if not(x in l2) ]
Was leistet diese Funktion?
Liefert eine Liste mit allen Elementen die in l1 und nicht in l2 enthalten sind.
dif=lambda l1,l2:[x for x in l1 if not(x in l2)]
hinzu=lambda L,x:[[x]+l for l in L]
flach=lambda L:(L<>[] and ((type(L[0])==list and
(flach(hd(L))+flach(tl(L))))
or (type(L[0])==int and [L]))) or ([])
perm=lambda
L:(len(L)<2 and L)
or (len(L)==2 and [L, L.reverse()])
or (flach([hinzu(perm(dif(L,[x])), x) for x in L]))
hinzu(L,x) Verlangt eine zweidimensionale Liste und fügt jeder Unterliste des Element
x hinzu.
flach(L) Erwartet mehrdimensionale Listen etwa der Art [[[], [], []], [[],[]]].
Die Funktion macht die Strukur flacher, indem die Listen der Untersten Ebene in eine
neue Liste eingefuegt werden, im Beispiel also [[], [], [], [], [], []].
3.3
Pythogoräische Tripel
Bestimme eine Liste von Tripeln mittels einer Funktion tripel, die jeweils ein Pythogoräische Tripel bilden; die Tripeleigenschaft ist
(x,y,z) <===> x*x+y*y == z*z
tripel=lambda n: [[x, (x*x-1)/2, (x*x+1)/2] for x in range(3,n+1)
if (x%2!=0 and ((x*x-1)/2)*((x*x-1)/2)<=n)] +
[[x*2, (x*x*4-1)/2, (x*x*4+1)/2] for x in range(3,n+1)
if (x%2!=0 and ((x*x*4-1)/2)*((x*x*4-1)/2)<=n)]
Ermittle die Anzahl Elemente in tripel(100).
Nichtprozedurale Programmierung
Tobias Webelsiep
Aufgabe
3.4
Seite 7
Paarbildung
Erzeuge aus zwei gegeben Listen eine neue Liste, die jeweils aus Paaren der Listenelemente bestehen. Kann diese Definition auf alle Sequenztypen angewendet werden?
pair=lambda L1,L2:map(None, L1, L2)
3.5
Matrizen-Rechnung
Beschreibe ein Matrix als Liste von Listen. Die inneren Listen sollen die Zeilen repräsentiern.
• Berechne das Produkt von Matrizen.
• Berechne die Determinante einer Matrix
• Berücksichtige die notwendigen Fallunterscheidungen
Hinweis: Benutze als Hilfsfunktion u.a. das Skalarprodukt von zwei Vektoren (einzeilige
Matrizen)
skp = lambda v1,v2: reduce(add, map(mult, v1,v2))
Produkt von Matrizen
skp=lambda v1,v2: reduce((lambda a,b:a+b), map((lambda a,b:a*b), v1,v2))
switch=lambda M,n=0:(len(M[0])>n and
([[e[n] for e in M]] + switch(M, n+1))) or []
prod=lambda M1,M2:(M1<>[] and M2<>[] and len(M1[0])==len(M2) and
([[skp(e1,e2) for e2 in switch(M2)] for e1 in M1]))
or []
Determinanten Berechnung
del_spalte=lambda M,i,n=0:(len(M)>n and
([M[n][0:i]+M[n][i+1:]] + del_spalte(M,i,n+1))) or []
del_zeile=lambda M,i:(len(M[0])>i and
M[0:i]+M[i+1:]) or []
konnekt=lambda x,y,n:(n%2==0 and [x+y]) or [-x+y]
det2=lambda M:(len(M)==2 and M[0][0]*M[1][1]-M[0][1]*M[1][0])
unterdet=lambda M,x:del_spalte(del_zeile(M, 0), x)
det=lambda M,n=0:(len(M)==len(M[0]) and len(M[0])>n and
(len(M)>2 and konnekt(M[0][n]*det(unterdet(M,n)), det(M, n+1), n)[0]
or det2(M)))
Nichtprozedurale Programmierung
Tobias Webelsiep
Aufgabe
3.6
Seite 8
Varianzberechnung / Listensortierung
Studieren Sie
1. die Varianzberechnung aus dem Python-Buch
2. Listensortierung aus dem Python-Buch
3.7
Modul: string
Analysiern Sie die wesentlichen Methoden des Moduls string!
Nichtprozedurale Programmierung
Tobias Webelsiep
Herunterladen