Rekursion und Iteration Programmieren in Derive Aline Rumöller Rekursion und Iteration Programmieren in Derive ● IF-Anweisungen in Derive ● Rekursion ● Vektorfunktionen in Derive ● Schleifen in Derive ● Iteration If-Anweisungen in Derive DERIVE: IF(b, w, f) Wenn eine Bedingung b erfüllt ist, wird wahr_Anweisung w ausgeführt, sonst die falsch_Anweisung f. Bsp.: f(x) ≔ IF(x=0, RETURN(false), 1/x) f(6) f(0) 1/6 false IF-Anweisung Selbstversuch Schreibe eine IF-Anweisung G(a,b), in der Derive die größere von zwei Zahlen wiedergibt. Schreibe eine Anweisung GG(a,b) die deine Anweisung G derart verbessert, dass eine 0 zurückgegeben wird, wenn die beiden Zahlen gleichgroß sind. IF-Anweisung Selbstversuch Schreibe eine IF-Anweisung G(a,b), in der Derive die größere von zwei Zahlen wiedergibt. G(a,b) ≔ IF(a<b, b, a) Schreibe eine Anweisung GG(a,b) die deine Anweisung G derart verbessert, dass eine 0 zurückgegeben wird, wenn die beiden Zahlen gleichgroß sind. GG(a,b) ≔ IF(a=b,0,IF(a<b,b,a)) oder auch GG(a,b) ≔ IF(a=b,0,G(a,b)) Rekursion (lat. recurrere „zurücklaufen“) Grundidee: Der Funktionswert f(n) einer rekursiven Funktion ergibt sich durch Verknüpfung bereits berechneter Funktionswerte f(n-1), f(n-2),..., d.h. die Funktion wird durch sich selbst (rekursiv) definiert. Rekursion: Beispiel Berechnet werden soll die Summe der ersten n Zahlen. n su n=∑ i i=0 Rekursionsanfang: su 0=0 Rekursionsschritt: n−1 su n=∑ in i=0 su n=su n−1n Rekursion: Beispiel Berechnet werden soll die Summe der ersten n Zahlen. n su n=∑ i i=0 Rekursionsanfang: su 0=0 Rekursionsschritt: n−1 su n=∑ in i=0 su n=su n−1n Umsetzung in Derive Eingabe: su(n) ≔ IF ( n = 0, 0, su(n-1) + n) Ausgabe von Derive su(n) ≔ IF n = 0 0 su(n-1) + n Rekursion: erster Eigenversuch Wie könnte eine Rekursive Umsetzung der Fakultätsfunktion in Derive aussehen? Rekursion: Lösungsvorschlag fac(n) So könnte eine Rekursive Umsetzung der Fakultätsfunktion in Derive aussehen. fac(n) ≔ IF(n = 0, 1, n · fac(n-1) ) Rekursion: zweiter Eigenversuch Versuche eine Rekursive Funktion in Derive zu definieren, die den größten gemeinsamen Teiler von zwei Zahlen berechnet. Rekursion: Lösungsvorschlag ggt(a,b) Eine Möglichkeit mit Hilfe einer Rekursiven Funktion den größten gemeinsamen Teiler von zwei Zahlen mit Derive zu berechnen. ggt(a, b) ≔ IF(a = b, a, IF(a < b, ggt(b - a, a), ggt(a - b, b) ) ) Vectorfunktionen in Derive ● Formalismus Beispiel vector(f,x,a,e) VECTOR(2x-1,x,3,7) [5,7,9,11,13] ● vector(f,x,e) VECTOR(2x-1,x,7) [1,3,5,7,9,11,13] ● table(f,x,v) v ≔ [5,13,8] TABLE(2x-1,x,v) [ ] 5 9 13 25 8 15 Iteration (v. lat. iterare „wiederholen“) Grundidee: Der Funktionswert f(n) einer iterativen Funktion wird schrittweise berechnet, indem in jedem Schritt dasselbe Rechenverfahren angewandt wird. Dabei werden oft die vorhergehend berechneten Werte als Ausgangswert für den nächsten Funktionswert f(n+1) hergenommen. Abgebrochen wird bei erreichter Genauigkeit. Iteration: Beispiel Wurzelbestimmung nach Heron wurzel(a, s, z) ≔ Prog{ i ≔ 0 ; w≔ s Loop{ IF (i = z; RETURN w) w ≔ (w + a/w) /2; i ≔ i+1 vector((wurzel(a, s, n), n, z)) }} Iterates / Iterate Die Wurzel von a soll Näherungsweise durch a x x die Funktion h a , x := 2 bestimmt werden. Zu wählen ist ein Startwert s und gegebenenfalls die Anzahl der Iterationen z. Iterates / Iterate Die Wurzel von a soll Näherungsweise durch a x x die Funktion h a , x := 2 bestimmt werden. Zu wählen ist ein Startwert s und gegebenenfalls die Anzahl der Iterationen z. h(a,x) ≔ ((x+a/x)/2) wurzel(a,s,z) ≔ ITERATES(h(a,x),x,s,z) Berechne die Wurzel von 2 mit dem Startwert 2 und mit 7 Iterationen. Iterate / Iterates wurzel(2,2,7) ≔ ITERATES(h(a,x),x,s,z) ≈ [2, 1.5, 1.416666666, 1.414215686, 1.414213562, 1.414213562, 1.414213562, 1.414213562] Vergleiche mit dem Ergebnis von VEREINFACHE. Was ändert sich in Derive, wenn man statt ITERATES den Befehl ITERATE wählt? Wo liegt also der Unterschied dieser Befehle? Iteration: Eigenversuch Schreibe eine Definitionsvorschrift für das berechnen von Kettenbrüchen. a kette a , b , x:=b a b a b ... a b x Approximiere mit a=1, b=2, dem Startwert 0 und 7 Iterationen. Iteration Lösungsvorschlag kette(a,b,s,z) bruch(a,b,x) ≔ b+a/(x) kette(a,b,s,z) ≔ ITERATES(bruch(a,b,x),x,s,z) kette(1,2,0,7) [0, ±∞, 2, 2.5, 2.4, 2.416666666, 2.413793103, 2.414285714] Unterschied zwischen VECTOR und ITERATES ● VECTOR(f, x, s, z) : v(n) ≔ VECTOR(n*x, x, 1, 4) ● ITERATES(f, x, s, z) : it(n) ≔ ITERATES(n*x, x, 1, 4) Unterschied zwischen VECTOR und ITERATES ● VECTOR(f, x, s, z) : [f(x), f(x+1), ..., f(x+z)] v(n) ≔ VECTOR(n*x, x, 1, 4) [n, 2n, 3n, 4n] ● ITERATES(f, x, s, z) : [s, f(s), f(f(s)), ..., f(f(...f(s)))] it(n) ≔ ITERATES(n*x, x, 1, 4) [1, n, n2, n3] Rekursion vs Iteration Rekursion ● ● 11ms für die Berechnung von fac(100) Eleganterer Algorithmus Iteration ● ● 4ms für die Berechnung von fac(100) Effizienterer Algorithmus Rekursion oder/und Iteration Fibonacci-Zahlen ● ● Fibonacci startet mit 1 Pärchen Kaninchen und geht davon aus, dass jedes Pärchen von dem 2. Jahr an ein weiteres Nachwuchspärchen bekommt. Die Kaninchen leben unendlich lange. Gib die ersten 8 Fibonacci Zahlen mithilfe deiner Fibonacci-Funktion aus. Lösungen fib(n) ● Rekursiv: f(n) ≔ IF( n = 0, 1, IF( n = 1, 1, f(n-1) + f(n-2))) Fibonacci-Zahlen von 0-7: VECTOR(f(n), n, 0, 7) [1, 1, 2, 3, 5, 8, 13, 21] ● Iterativ: fib(n) ≔ ITERATES([v ↓ 2, v ↓ 1 + v ↓ 2], v, [0, 1], n) Fibonacci-Zahlen von 0-7: fib(7) [] 0 1 1 1 1 2 2 3 3 5 5 8 8 13 13 21 Literatur ● DERIVE für den Mathematikunterricht Wolfram Koepf ● Grundlagen der Informatik Thomas Walter ● Informatik 1 Friedrich L. Bauer, Gerhard Goos Literatur im www ● ● ● Eine Einführung in Derive http://www.waldoberschule.de/mathematik/download/ DeriveEinf.pdf [06.05.2009] Derive Demo: http://www.austromath.at/daten/derive/derivedemo.htm [06.05.2009] Leitprogramm Rekursion: http://ddi.cs.unipotsdam.de/HyFISCH/IterationRekursion/ LeitprogrammRekursion.pdf [09.05.2009] Table und Vector in der Anwendung Versuche mit Hilfe von TABLE und VECTOR die Zeilen von 0-10 des Pascalschen Dreiecks auf deinen Bildschirm zu zaubern. TIPP: Comb(a,b) Pascalsches Dreieck 0 [1] 1 [1, 2 [1, 3 [1, 5 [1, 7 [1, 8 [1, 9 [1, [1, 8, 9, 10, 28, 36, 45, 35, 56, 84, 120, 126, 210, 1] 10, 20, 21, 1] 4, 10, 15, 7, 3, 6, 5, 6, 1] 3, 4, [1, 6 10 2, [1, 4 ,1] 5, 15, 6, 35, 70, 126, 252, 1] 1] 21, 56, 7, 28, 84, 210, 1] 8, 36, 120, 1] 9, 45, 1] 10, 1] Table und Vector in der Anwendung Versuche mit Hilfe von TABLE und VECTOR die Zeilen von 0-10 des Pascalschen Dreiecks auf deinen Bildschirm zu zaubern. TIPP: Comb(a,b) TABLE (VECTOR (COMB(n,k), k, 0, n), n, 0, 10) Rekursion zu Iteration Schreibe iterative Prozeduren zur Berechnung der Fakultät einer Zahl und zur Berechnung der Summe der ersten n natürlichen Zahlen.