Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

REKURSION + ITERATION. Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen.

Ähnliche Präsentationen


Präsentation zum Thema: "REKURSION + ITERATION. Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen."—  Präsentation transkript:

1 REKURSION + ITERATION

2 Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen. Die exakten Beweise wurden dazu in einem anderen Dokument gemacht.

3 Produktion von wunderbaren Zahlen.

4 Dazu werden natürlich wieder die Regeln (zur Produktion) verwendet. Diese sind…

5 {r; s} wobei r X={1; 2; 3;...} und s X und r s r+s Regel 1, kurz R1 Regel 2, kurz R2 Regel 3, kurz R3 Zu einer Regel, die an der die leere Menge beteiligt ist, sagt man auch Axiom. Wir sagen zu den "Produkten" 3 und 5 jeweils Atom.

6 Die Produktion beginnt wie üblich mit dem "Urknall" (= leere Menge). D0 = Welche Menge D1 wird dann danach produziert ? Welche Regel kann man dazu anwenden (verwenden)?

7 Da es für den "Urknall" nur 2 Regeln gibt, kann man nur R1 und R2 verwenden. Also…

8 Aus dieser wird dann wieder (mit Hilfe von R1 und R2) die Menge D1 gebastelt 3 Mit der leeren Menge beginnt alles 5 Wie sieht die Menge D2 aus? Wie wird sie gebastelt?

9 Man darf jetzt beliebige Teilmengen aus D1 auswählen und auf diese eine Regel anwenden. Was ist die kleinste Teilmenge in D1? 35 Das ist die leere Menge. Welche Regeln kann man darauf anwenden? R1 und R2, also bekommt man die Elemente… 35 Auf welche weitere Teilmenge von D1 kann man welche Regel anwenden ? Auf die Menge {3;5}. Dies ergibt das neue Element 3+5 = 8 8 D1 D2

10 Man darf jetzt beliebige Teilmengen aus D2 auswählen und auf diese eine Regel anwenden. Was ist die kleinste Teilmenge in D2? 35 Das ist die leere Menge. Welche Regeln kann man darauf anwenden? R1 und R2, also bekommt man die Elemente… 3 5 Auf welche weitere Teilmenge von D2 kann man welche Regeln anwenden ? Auf die Mengen {3;5}. Dies ergibt dann das neue Element 3+5 = 8 D2 D3 8 8

11 D2 D3 8 8 Auf welche weitere Teilmengen von D2 kann man welche Regeln anwenden ? Auf die Mengen {3;8}, {5;8}. Dies ergibt dann die neuen Elemente 3+8=11, 5+8= Dies geht unendlich oft weiter … Die Vereinigung all dieser Mengen ist die zu konstruierende Gesamtmenge D = {3;5;8;11;13; …} der wunderbaren Zahlen Welche mengentheoretische Beziehung besteht zwischen D0, D1, D2, D3, usw. ? D0 D1 D2 D3 … D

12 3 5 D3 8 Uns interessiert nun, ob eine Zahl zu der Gesamtmenge D gehört oder nicht. Dazu definiert man die Funktion e (wie evaluate) mit … 1113 e(x) = 1 x D und e(x) = 0 x D Berechnen Sie dazu e(1), e(2), e(3), e(4), e(5), e(6), e(7), e(8) e(1)=0, e(2)=0, e(3)=1, e(4)=0, e(5)=1, e(6)=0, e(7)=0, e(8)=1 1 könnte man auch als W (wahr) und 0 als F (falsch) interpretieren.

13 Man könnte nun eine Funktion e(int z) implementieren, die feststellt, ob die Zahl z zu D gehört oder nicht. Wie könnte man dies iterativ machen?

14 Wiederholt werden aus der alten Menge die neuen Elemente berechnet und dieser Menge hinzugefügt. Dies muß hinreichend oft gemacht werden.

15 Wie kann dies rekursiv realisiert werden …? Beachten Sie dazu folgende Informationen...

16 D = {3 ; 5 ; 8 ; 11; 13;...} 3 D und 5 D ==> ? Was folgt daraus, d.h. welche Zahl gehört dann auch zu D ?

17 D = {3 ; 5 ; 8 ; 11; 13;...} Man sieht sofort: 3 D und 5 D ==> 3+5 D

18 D = {3 ; 5 ; 8 ; 11; 13;...} Allgemeiner: r D und s D ==> ? Was folgt daraus, d.h. welche Zahl gehört dann auch zu D ?

19 D = {3 ; 5 ; 8 ; 11; 13;...} Allgemeiner: r D und s D ==> r+s D

20 D = {3 ; 5 ; 8 ; 11; 13;...} Gilt dies auch umgekehrt ? D.h: r+s D ==> r D und s D Wenn dies nicht gelten sollte, geben Sie bitte ein Gegenbeispiel an.

21 D = {3 ; 5 ; 8 ; 11; 13;...} r+s D ==> r D und s D Diese Aussage ist falsch, denn aus 8 D folgt NICHT 1 D und 7 D

22 D = {3 ; 5 ; 8 ; 11; 13;...} r+s D ==> r D und s D Kann man diese Aussage so abändern, daß sie korrekt wird ? Bedenken Sie dazu, daß zwar...

23 D = {3 ; 5 ; 8 ; 11; 13;...} 8 D ==> 1 D und 7 D falsch, aber 8 D ==> 3 D und 5 D richtig ist.

24 8 D 1 D 7 D 2 D 6 D 3 D 5 D d.h. in mindestens einer Zerlegung müssen alle 2 Zahlen aus D sein !

25 8 D 1 D 7 D 2 D 6 D 3 D 5 D bzw. wenn man die Schreibweise mit e(...) verwendet...

26 e(8)=1 e(1)=1 e(7)=1 e(2)=1 e(6)=1 e(3)=1 e(5)=1 oder wenn man statt und lieber * und + schreibt:

27 e(8)=1 e(1)=1 * e(7)=1 + e(2)=1 * e(6)=1 + e(3)=1 * e(5)=1 Wie kann man e(8) aus e(1),..., e(7) berechnen? e(8)=e(1)+e(2)+...e(7) wäre z.B. nicht korrekt!

28 e(8) = e(1) * e(7) + e(2) * e(6) + e(3) * e(5) Welchen Wert haben e(1),..., e(7) und wie berechnet man daraus e(8) ?

29 e(8) = e(1) * e(7) + e(2) * e(6) + e(3) * e(5) e(8) wird rekursiv, d.h. durch die Verwendung von "vorigen" Werten e(1),..., e(7) berechnet

30 Dies kann man auch etwas mathematischer darstellen:

31 e(8) = e(x1) * e(x2) {x1,x2} K(8) wobei K(x) die zu x gehörende Kandidatenmenge ist. K(8) = { {1, 7}, {2, 6}, {3, 5} }

32 Weitere rekursive Berechnungen?

33 e(5) = ? Wie berechnet man aber e(5) rekursiv, d.h. kann e(5) durch Verwendung von e(1),..., e(4) berechnet werden ?

34 Nein, denn 5wird direkt aus der leeren Menge produziert Also ist e(5) = 1

35 e(2) = ? Wie berechnet man aber e(2) rekursiv, d.h. kann e(2) durch Verwendung von e(1) berechnet werden ?

36 Nein, denn 2 kann nicht als Summe zweier verschiedener Zahlen 1 dargestellt werden. Da 2 auch nicht aus der leeren Menge produziert wird, gilt e(2) = 0

37 Rekursive Berechnung von e(7) Aus welchen Elementen aus D könnte die 7 theoretisch produziert worden sein?

38 7 1, 6 3, 4 2, 5 1, Wie groß ist jeweils e(b), d.h. welchen Wert haben die roten Blätter ? e(6)= 0*1+0*0 e(7)= 0*0+0*1+1*0 2, 4 1, e(4)= 0*1 e(4)= 0*1 0

39 Insgesamt ergibt dies die folgende mathematische Formel:

40 // Kandidatenmenge leer: Fall: K(x) = ==> e(x) = 0 // x kommt direkt nach dem Urknall: Fall: K(x) ==> e(x) = 1 Fall: sonst e(x) = e(x1) * e(x2) {x1,x2} K(x)

41 Bevor wir die zugehörige Funktion e(...) implementieren, machen wir noch ein paar Überlegungen...

42 Wie kann man die folgende Formel implementieren? e(x) = e(x1) * e(x2) {x1,x2} K(x) Man kann die zu x gehörige Kandidaten K(x) bestimmen und in ein Feld v eintragen. Für K(15) wäre dies z.B: Was muß dann noch berechnet werden ? e(1)*e(14) + e(2)*e(13) + e(3)*e(12) + e(4)*e(11)+ e(5)*e(10) + e(6)*e(9) + e(7)*e(8) Angenommen, die Funktion e(x) würde schon implementiert sein. Implementieren Sie e(1) * e(14) e(7) * e(8) e(15) =

43 ... int sum=0; for(i=1;i<15;i=i+2){ sum = e(i)*e(15-i)+sum; }...

44 Annahme: Das Feld v ist sehr groß. Wie könnte man die Laufzeit (Performance) des Programms verbessern ? Beachten Sie dazu Folgendes:

45 e(1)*e(14) + e(2)*e13) + e(3)*e(12) + e(4)*e(11) + e(5)*e(10) + e(6)*e(9) + e(7)*e(8) Welche Werte können e(1),..., e(14) annehmen ? 0 oder 1 Angenommen, man interpretiert den obigen Term als logischen Ausdruck (* als das logische UND und + als das logische ODER). Welchen Wert (Integer-Zahl) hat dann der obige Term, wenn er FALSCH ist ? Welchen Wert (Integer-Zahl) hat dann der obige Term, wenn er WAHR ist ? Wenn er FALSCH ist, dann muß e(1),..., e(14) gleich 0 sein, also hat der Term den Wert 0. Wenn er WAHR ist, dann können e(1),..., e(14) alle gleich 1 sein, also hat der Term einen Wert zwischen 1 und 7. Kurz: FALSCH entspricht 0 WAHR entspricht 1

46 Aufgabe: Angenommen, die Funktion e(x) würde schon implementiert sein. Implementieren Sie e(1) * e(14) e(7) * e(8) unter der Bedingung, daß sich das Laufzeitverhalten verbessert.

47 int sum=0; for(i=0;i<14;i=i+2){ sum = e(i)*e(15-i); if (sum==1) break; } Wenn sum das 1. Mal den Wert 1 hat, ist der Wahrheitswert W, unabhängig davon, was die nachfolgenden Produkte für Werte haben.

48 Aufgabe: Erstellen Sie die Funktion eRek(int zahl), die berechnet, ob eine Zahl zu den wunderbaren Zahlen gehört (oder nicht)

49 Lösung:

50 #include "stdafx.h" int eRek(int zahl); int main(){ int erg, i; for(i=1;i<20;i++){ erg = eRek(i); printf("%d %d\n", i,erg); } return 0; }

51 int eRek(int zahl){ int i,erg,zahl1,zahl2; if(zahl==3 || zahl==5) // K(zahl) erg=1; else { // K(zahl) bestimmen for (i=1;i<=zahl-1;i++){ zahl1=i; zahl2=zahl-zahl1; if(zahl1!=zahl2){ // sonst erg=eRek(zahl1)*eRek(zahl2); if(erg==1) return 1; } erg=0; // K(zahl)= } return erg; }

52 Weiteres Beispiel: Regulärer Ausdruck

53 Zuerst ein paar Definitionen

54 Alle folgenden Zeichenketten sollen aus dem Alphabet A = { a, b, c } bestehen. D.h. eine beliebige Zeichenkette darf nur aus diesen 3 Zeichen bestehen. Die Menge aller Zeichenketten, die aus dem Alphabet A hergestellt werden, bezeichnen wir mit X.

55 Wenn eine Zeichenkette über dem Alphabet A die Länge n hat, schreibt man dafür kurz: | z | = n Beispiel: | abca | = 4

56 Beispiele von Zeichenkette über A und keinen Zeichenketten über A

57 caba baba mit mamma aaaaahhh (a+b) abba acbacbacbacbcbbacbac ZK über A Was sind Zeichenketten über dem Alphabet A, was nicht ? ZK über A keine ZK über A ZK über A

58 Jetzt zu den regulären Ausdrücken

59 Für das Alphabet A gilt im Folgenden: A = {a, b, c}

60 a* bedeutet die Menge aller Zeichenketten, die aus beliebig vielen a besteht. Das Zeichen * bedeutet Wiederholung. Aus welchen Elementen besteht dann also die Menge X aller Zeichenketten der Form a* ?

61 X = {a, aa, aaa, aaaa,...}

62 a | b bedeutet die Menge aller Zeichenketten, die entweder aus dem Zeichen a oder dem Zeichen b besteht. Das Zeichen | bedeutet oder. Aus welchen Elementen besteht dann also die Menge X aller Zeichenketten der Form a|b ?

63 X = {a, b}

64 a* | b* Aus welchen Elementen besteht dann also die Menge X aller Zeichenketten der Form a* | b* ?

65 X = {a, aa, aaa,..., b, bb, bbb,...} Dies könnte man mengentheoretisch auch schreiben als...

66 X = {a, aa, aaa,...} {b, bb, bbb,...}

67 a (a | b | c)* Die Klammer bedeutet, daß der Ausdruck in der Klammer zuerst abgearbeitet wird. Aus welchen Elementen besteht dann also die Menge X aller Zeichenketten der Form a (a | b | c)* ?

68 X = Menge aller Zeichenketten (über A), die mit dem Zeichen a beginnen.

69 a c* a Aus welchen Elementen besteht dann also die Menge X aller Zeichenketten der Form a a c* a ?

70 X = Menge aller Zeichenketten (über A), die mit dem Zeichen a beginnen und enden und dazwischen nur aus beliebig vielen (auch 0) Zeichen c bestehen. Mengentheoretisch geschrieben...

71 X = {aa, aca, acca, accca,...}

72 Aufgabe: Geben Sie die Regeln an, die die Zeichenketten der Form a* erstellen.

73 --- a {z} wobei z X=Menge aller az Zeichenketten über A Regel 1, kurz R1 Regel 2, kurz R2

74 Aufgabe: Geben Sie die Mengen D0, D1, D2, D3,... an.

75 D0 = D1 = {a} D2 = {a, aa} D3 = {a, aa, aaa}...

76 Wie kann man rekursiv berechnen, ob eine Zeichenkette ein regulärer Ausdruck der Form a* ist oder nicht ?

77 Schauen wir uns dazu die Formel von vorher an:

78 // Kandidatenmenge leer: Fall: K(x) = ==> e(x) = 0 // x kommt direkt nach dem Urknall: Fall: K(x) ==> e(x) = 1 Fall: sonst e(x) = e(x1) * e(x2) {x1,x2} K(x)

79 Da hier K(x) nur aus einer einelementigen Menge produziert wird, gilt: e(x) = e(x1) {x1} K(x)

80 // Kandidatenmenge leer: Fall: K(x) = ==> e(x) = 0 // x kommt direkt nach dem Urknall: Fall: K(x) ==> e(x) = 1 Fall: sonst e(x) = e(x1) {x1} K(x) Bei welchen Zeichenketten ist dies der Fall? Wenn die Zeichenkette ein Zeichen ist (Länge = 1) und dieses Zeichen a ist. Bei welchen Zeichenketten ist dies der Fall? Wenn die Zeichenkette ein Zeichen ist (Länge = 1) und dieses Zeichen a ist. Was ist z.B. K(aaabc) ? K(aaabc) = { aabc } d.h. K(aaabc) besteht nur aus einem Element.

81 Bevor wir die zugehörige Funktion eRek(...) implementieren, machen wir noch ein paar Überlegungen...

82 Wie kann man die folgende Formel implementieren? e(x) = e(x1) {x1} K(x) Man kann den zu x gehörigen Kandidaten K(x) bestimmen und in ein Feld v eintragen. Für K(aaabc) wäre dies z.B: aabc Was muß dann noch berechnet werden ? e(v) Dies könnte analog zu den wunderbaren Zahlen implementiert werden. Dann müßte man noch ein Feld erstellen. Wenn man dies nicht will, kann man dies wie folgt machen:

83 aaabc aabc string Wo beginnt diese Zeichenkette bzgl. der Zeichenkette string ? begin+1 begin Man übergibt der Funktion e nicht nur eine Zeichenkette string, sondern auch den Beginn dieser Zeichenkette: Für K(aaabc) wäre dies z.B: e(aaabc,begin) wobei hier begin = 0 wäre. Die Kandidatenmenge K(aaabc) wäre wieder:

84 Aufgabe: Erstellen Sie die Funktion eRek(...) die berechnet, ob eine Zeichenkette ein regulärer Ausdruck der Form a* ist oder nicht.

85 #include "stdafx.h" #include int e(char string[], int begin, int end); int main(){ int erg; char string[] = "aaaaaaaab"; erg=e(string,0,strlen(string)); if(erg==1) printf("ZK ist von der Form a^*\n\n"); else printf("ZK ist nicht von der Forma^*\n\n"); return 1; } Berechnet Länge einer Zeichenkette Deswegen muß entsprechende Header-Datei eingefügt werden.

86 int e(char string[], int begin, int end){ int len; int erg; len = end - begin + 1; if(len==1){ if(string[begin]=='a'){ erg=1; } else{ erg=0; } else{ if(string[begin]=='a'){ erg=e(string, begin+1, end); return erg; } return erg; }

87 Weiteres Beispiel: Terme

88 Alle folgenden Zeichenketten sollen aus dem Alphabet A = { a, b, ), (, + } bestehen. D.h. eine beliebige Zeichenkette darf nur aus diesen 5 Zeichen bestehen. Die Menge aller Zeichenketten, die aus dem Alphabet A hergestellt werden, bezeichnen wir mit X.

89 Wenn eine Zeichenkette über dem Alphabet A die Länge n hat, schreibt man dafür kurz: | z | = n Beispiel: | baba | = 4

90 Beispiele für Zeichenketten über A: a ba (b +bb (a) (a+b) ++++bbba+++)aa(bbb+++a ((a+a)+(b+b))

91 Unter einem mathematischen Term verstehen wir hier :

92 1) Einfache Variablen (das sind die Zeichen a und b 2) Zeichenketten der Form: (a+b), ((a+b)+b), ((b+a)+(b+(a+b))), usw. Bemerkung: a+b ist kein Term

93 Weitere Bemerkungen: d ist...kein Term a ist... ein Term (a+b ist...kein Term a+b+c ist...kein Term (a*b) ist...kein Term ((b+b)+(a+a)) ist... ein Term

94 Aufgabe: Geben Sie die Regeln (Regelmenge) an, mit denen man Terme induktiv definieren kann.

95 --- a --- b {z; s} wobei z X und s X (z+s) Regel 1, kurz R1 Regel 3, kurz R3 Regel 2, kurz R2

96 Aufgabe: Geben Sie die Mengen D0, D1, D2, D3 an.

97 D0 =

98 D1 = {a, b}

99 D2 = { a, b, (a+b), (b+a), (a+a), (b+b) }

100 D3 = { a, b, (a+b), (b+a), (a+a), (b+b), (a+(a+b)), (a+(b+a)), (a+(a+a)), (a+(b+b)), (b+(a+b)), (b+(b+a)), (b+(a+a)), (b+(b+b)), ((a+b)+a), ((a+b)+b), ((a+b)+(a+b)), ((a+b)+(b+a)), ((a+b)+(a+a)), ((a+b)+(b+b)), ((b+a)+a), ((b+a)+b), ((b+a)+(a+b)), ((b+a)+(b+a)), ((b+a)+(a+a)), ((b+a)+(b+b)), ((a+a)+a), ((a+a)+b), ((a+a)+(a+b)), ((a+a)+(b+a)), ((a+a)+(a+a)), ((a+a)+(b+b)), ((b+b)+a), ((b+b)+b), ((b+b)+(a+b)), ((b+b)+(b+a)), ((b+b)+(a+a)), ((b+b)+(b+b)) }

101 Wie kann man rekursiv berechnen, ob eine Zeichenkette ein Term ist oder nicht ?

102 Schauen wir uns dazu die Formel von vorher an:

103 Fall: K(x) = ==> e(x) = 0 Fall: K(x) ==> e(x) = 1 Fall: sonst e(x) = e(x1) * e(x2) {x1,x2} K(x) wobei K(x) die zu x gehörende Kandidatenmenge ist. z.B: x = (a+b+b) K(x) = ?

104 x= (a+b+b) K(x) besteht dann aus den folgenden Elementen: {a, b+b}, {a+b,b} Diese bekommt man, indem man …

105 x= (a+b+b) K(x) besteht dann aus den folgenden Elementen: {a, b+b}, {a+b,b} …an jedem vorkommenden + die linke und rechte (bzgl. des Zeichens + ) Teilzeichenfolge betrachtet (abzüglich der linken Klammer bzw. der rechten Klammer), also:

106 1. Kandidatenelement von: x= (a+b+b) a b+b (a abzüglich der linken Klammer ergibt: b+b) abzüglich der rechten Klammer ergibt: Teilzeichenkette links des 1. + Zeichens: Teilzeichenkette rechts des 1. + Zeichens: also: { a, b+b }

107 Bestimmen Sie das 2. Kandidatenelement von: x= (a+b+b)

108 2. Kandidatenelement von: x= (a+b+b) Teilzeichenkette links des 2. + Zeichens: (a+b abzüglich der linken Klammer ergibt: a+b Teilzeichenkette rechts des 2. + Zeichens: b) abzüglich der rechten Klammer ergibt: b also: {a+b, b}

109 Weiteres Beispiel: x= a+b+c) K(x) = ?

110 x= a+b+c) K(x) = Denn es gibt keine Regel mit der man x produzieren kann. Regel 2 produziert nämlich links die Klammer ( und rechts die Klammer ) und Regel 1 verlangt, daß x ein Zeichen ist.

111 Weiteres Beispiel: x ist eine aus mehreren Zeichen bestehende Zeichenkette, die am Anfang keine öffnende Klammer ( oder am Ende keine schließende Klammer ) hat. K(x) = ?

112 K(x) = Denn es gibt keine Regel mit der man x produzieren kann. Regel 2 produziert nämlich links die Klammer ( und rechts die Klammer ) und Regel 1 verlangt, daß x ein Zeichen ist.

113 Weiteres Beispiel: x= a e(x) = ? Warum braucht man hier nicht K(x) zu berechnen? Weil x direkt von der leeren Menge produziert wird, also K(x). Also ist e(x) = 1

114 Weitere Beispiele: z2 mit |z2|=2, z3 mit |z3|=3 und z4 mit |z4|=4 seien Zeichenketten über dem Alphabet A (siehe oben) mit den Längen 2, 3, und 4. K(z2) = ? K(z3) = ? K(z4) = ?

115 Weitere Beispiele: z2 mit |z2|=2, z3 mit |z3|=3 und z4 mit |z4|=4 sind Zeichenketten über dem Alphabet A (siehe oben) mit den Längen 2, 3, und 4. K(z2) = K(z3) = K(z4) =

116 ((a+(b+a)+b) (a, (b+a)+b (a+(b+a), b (a+(b, a)+b Wie groß ist jeweils e(…), d.h. welchen Wert haben die roten Blätter ? e(((a+(b+a)+b))= 0*0+0*0+1*0*1 1 0 a, (b+a 1 0 =e((a+(b+a)) 0 a+(b, a 1*0+0*1

117 Bevor wir die zugehörige Funktion eRek(...) implementieren, machen wir noch ein paar Überlegungen...

118 Wie kann man die folgende Formel implementieren? e(x) = e(x1) * e(x2) {x1,x2} K(x) Man kann die zu x gehörige Kandidaten K(x) bestimmen und in ein Feld v eintragen. Für K((((a+b)+c)+(a+c))) wäre dies z.B: ((ab)+c)+(a+c)((a+b)c)+(a+c) Was muß dann noch berechnet werden ? e(v[0])*e(v[1]) + e(v[2])*e(v[3]) + e(v[4])*e(v[5]) + e(v[6])*e(v[7]) Dies könnte analog zu den wunderbaren Zahlen implementiert werden. Doch bräuchte man dazu noch ein paar selbstgeschriebene Funktionen, wie z.B. das Splitten (aufteilen) einer Zeichenkette in eine Zeichenkette links von + und rechts von +. Da dies etwas aufwendig ist, machen wir dies wie folgt: ((a+b)+c)(a+c)((a+b)+c)+(ac) Feld v geht hier weiter

119 Man übergibt der Funktion e nicht nur eine Zeichenkette string, sondern auch den Beginn und das Ende dieser Zeichenkette: Für K((((a+b)+c)+(a+c))) wäre dies z.B: e((((a+b)+c)+(a+c)),begin, end) wobei hier begin = 0 und end = 16 wäre. Die Kandidatenmenge K((((a+b)+c)+(a+c))) wäre wieder: ((ab)+c)+(a+c)((a+b)c)+(a+c) ((a+b)+c)(a+c)((a+b)+c)+(ac) Diese Indizes i1 bis i4 könnte man in einer for-Schleife ermitteln. Index(Stelle) i4 Index(Stelle) i3 Index(Stelle) i1 Index(Stelle) i2 Mit i1 bis i4 werden die Indizes der Rechenzeichen bezeichnet.

120 (((a+b)+c)+(a+c)) ((ab)+c)+(a+c)((a+b)c)+(a+c) ((a+b)+c)(a+c)((a+b)+c)+(ac) i1 i2 i3 i4 string Wo beginnen bzw. enden diese 8 Zeichenketten bzgl. der Zeichenkette string ? begin+1, i1-1 begin end i1+1, end-1 begin+1, i2-1 i2+1, end-1 begin+1, i3-1 i3+1, end-1 begin+1, i4-1 i4+1, end-1

121 (((a+b)+c)+(a+c)) ((ab)+c)+(a+c)((a+b)c)+(a+c) ((a+b)+c)(a+c)((a+b)+c)+(ac) i1 i2 i3 i4 string Wo beginnen bzw. enden diese 8 Zeichenketten bzgl. der Zeichenkette string ? begin end Was wird in dieser Funktion nun berechnet (aufgerufen)? sum = sum + e(string,begin+1,i-1)*e(string,i+1,end-1) sum am Anfang 0 sein muß und i die Werte zwischen begin und end durchläuft und die Bedingung string[i]== '+' gelten muß. wobei sum =... und...

122 Aufgabe: Erstellen Sie die Funktion eRek(…), die berechnet, ob eine Zeichenkette ein Term ist oder nicht.

123 int eRek(char string[], int begin, int end){ int i; int len; int erg; len = end - begin + 1; // K(zahl) if(len==1 && (string[begin]=='a' || string[begin]=='b')){ erg=1; } // gleich geht es weiter

124 else{ // Zerlegungen versuchen for(i=begin+1; i


Herunterladen ppt "REKURSION + ITERATION. Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen."

Ähnliche Präsentationen


Google-Anzeigen