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