Programmieren lernen mit Groovy Rekursion Seite 1
Rekursion Rekursion Ursprung lat. recurrere ~ zurücklaufen rekursive Definition Definition mit Bezug auf sich selbst Beispiel Fakultätsfunktion n! 0! = 1 n! = (n-1)! * n als Funktionsdefinition: fak(0) = 1 fak(n) = fak(n-1)*n Seite 2
Rekursion Rekursion indirekte rekursive Definition (indirekte Rekursion) Definition mit indirektem Bezug auf sich selbst Beispiel gerade / ungerade gerade(0) = true gerade(n) = ungerade(n-1) 0 ist gerade n ist gerade, wenn n-1 ungerade ist ungerade(0) = false ungerade(n) = gerade(n-1) 0 ist nicht ungerade n ist ungerade, wenn n-1 gerade ist Seite 3
Rekursive Funktionen Rekursion in Programmiersprachen Rekursion in Programmiersprachen Rekursion ab ~ 1960 von allen (relevanten) Programmiersprachen unterstützt Ab ~1970 als wichtige Kontrollstruktur allgemein anerkannt und eingesetzt. E.W. Dijkstra: Pinonier der Informatik. Entwickelte u.a. Verfahren zum Übersetzen u. Ausführen rekursiver Funktionen Rekursion in Java / Groovy Beispiel Fakultätsfunktion def fak() { if ( == 0) return 1 else return fak(-1)* Version mit bedingter Anweisung def fak() { return == 0? 1 : fak(-1)* Version mit bedingtem Ausdruck def fak() { == 0? 1 : fak(-1)* eine noch kürzere Version Seite 4
Rekursive Funktionen Beispiel Die Summation 1 bis n n sumbis(n) = i i=0 kann rekursiv definiert werden. Wie? Seite 5
Rekursive Funktionen Beispiel Die Summation 0 bis n n sumbis(n) = i i=0 kann rekursiv definiert werden. Wie? sumbis(0) = 0 sumbis(n) = sumbis(n-1)+n Übung Schreiben Sie eine rekursive Funktion zur Berechnung der Summation 0 n und testen Sie sie in einer Schleife mit den Zahlen 1 15. Nutzen Sie eine andere Version der Berechnung zur Prüfung der Ergebnisse. Seite 6
def sumbisiterativ(n) { def sum = 0 for ( i = 0; i <= n; i = i+1 ) { sum = sum + i return sum Algorithmen, die mit Schleifen statt Rekursion arbeiten, nennt man iterativ. def sumbisrekursiv(n) { n == 0? 0 : sumbisrekursiv(n-1)+n for ( i in 1..15 ) { println i + "\titerativ: "+ sumbisiterativ(i) println "\trekursiv: " + sumbisrekursiv(i) Seite 7 \t erzeugt ein Tab-Zeichen
Beispiel : Berechnung der Eponentionfunktion / rekursiv Eponentialfunktion e =1 2 /2! 3 / 3! Welche Beziehung besteht zwischen den Summengliedern: Kann ein Summenglied aus seinem Vorgänger berechnet werden? (Rekursion?) Seite 8
Beispiel : Berechnung der Eponentionfunktion / rekursiv Eponentialfunktion e =1 2 /2! 3 / 3! Welche Beziehung besteht zwischen den Summengliedern: Kann ein Summenglied aus seinem Vorgänger berechnet werden? (Rekursion?) Startwert=1 1 = / 2= 2 / 2 2 /2 / 3= 3 / 3! 3 / 3! / 4= 4 / 4! (rekursive) Funktion? Seite 9
Beispiel : Berechnung der Eponentionfunktion / rekursiv Eponentialfunktion e =1 2 /2! 3 / 3! Welche Beziehung besteht zwischen den Summengliedern: Kann ein Summenglied aus seinem Vorgänger berechnet werden? (Rekursion?) Startwert=1 1 = / 2= 2 / 2 2 /2 / 3= 3 / 3! 3 / 3! / 4= 4 / 4! s(, 0) = 1 s(, i) = s(, i-1) * /i Funktion zur rekursiven Berechnung des i-ten Summanden? Seite 10
Beispiel : Berechnung der Eponentionfunktion / rekursiv Eponentialfunktion e =1 2 /2! 3 / 3! Welche Beziehung besteht zwischen den Summengliedern: Kann ein Summenglied aus seinem Vorgänger berechnet werden? (Rekursion?) Startwert=1 1 = / 2 = 2 / 2 2 /2 / 3= 3 / 3! 3 / 3! / 4= 4 / 4! s(, 0) = 1 s(, i) = s(, i-1) * /i def s(,i) { i == 0? 1 : s(,i-1) * / i e-funktion? Seite 11
Beispiel : Berechnung der Eponentionfunktion / rekursiv Eponentialfunktion e =1 2 /2! 3 / 3! Welche Beziehung besteht zwischen den Summengliedern: def e() { def r = 0 for ( j in 0..20 ) r = r + s(1,j) return r Kann ein Summenglied aus seinem Vorgänger berechnet werden? (Rekursion?) Startwert=1 1 = / 2= 2 / 2 2 /2 / 3= 3 / 3! 3 / 3! / 4= 4 / 4! s(, 0) = 1 s(, i) = s(, i-1) * /i def s(,i) { i == 0? 1 : s(,i-1) * / i Seite 12
Beispiel : Berechnung der Eponentionfunktion / rekursiv Eponentialfunktion e =1 2 /2! 3 / 3! def s(,i) { i == 0? 1 : s(,i-1) * / i def e() { def e = 0 for ( j in 0..20 ) e = e + s(,j) return e println e(1) Seite 13
Beispiel : Berechnung der Eponentionfunktion / iterativ Eponentialfunktion e =1 2 /2! 3 / 3! Welche Beziehung besteht zwischen den Summengliedern: Kann ein Summenglied aus seinem Vorgänger berechnet werden? (Iteration?) Startwert=1 1 = / 2 = 2 / 2 2 /2 / 3= 3 / 3! 3 / 3! / 4= 4 / 4! i 0 1 2 3 4 s 1 */2 **/2*3 ***/2*3*4 Vorwärtsberechnung: Wertverlaufstabelle Funktion zur iterativen Berechnung des i-ten Summanden? Seite 14
Beispiel : Berechnung der Eponentionfunktion / iterativ Eponentialfunktion 2 3 e =1 /2! / 3! Welche Beziehung besteht zwischen den Summengliedern: Kann ein Summenglied aus seinem Vorgänger berechnet werden? (Iteration?) i 0 1 2 3 4 s def s(,j) { def s = 1 if (j == 0) return 1 for (i in 1..j) { s = s*/i return s oder auch def s(,j) { def s = 1 def i = 0 while (i < j) { i = i+1 s = s*/i return s 1 */2 **/2*3 ***/2*3*4 e-funktion? Seite 15
Beispiel : Berechnung der Eponentionfunktion / iterativ Eponentialfunktion e =1 2 /2! 3 / 3! def s(,j) { def s = 1 def i = 0 while (i < j) { i = i+1 s = s*/i return s def e() { def e = 0 for ( j in 0..20 ) e = e + s(,j) return e println e(1) Seite 16
Übung Berechnen Sie die Eponentialfunktion e =1 2 /2! 3 / 3! in einer (einzigen) Funktion, die nur eine Schleife verwendet Konstruieren Sie Schleife aus einer Wertverlaufstabelle, in der auch die Summe, d.h. der angestrebte Wert berechnet wird. i 0 1 2 3 4 s 1 */2 **/2*3 ***/2*3*4 e 1 1+??? Seite 17