Rekursion und Iteration - Hu

Werbung
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=∑ in
i=0
su n=su n−1n
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=∑ in
i=0
su n=su n−1n
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.
Herunterladen