129
REKURSION + ITERATION

REKURSION + ITERATION

  • Upload
    becka

  • View
    46

  • Download
    0

Embed Size (px)

DESCRIPTION

REKURSION + ITERATION. 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. Produktion von wunderbaren Zahlen. - PowerPoint PPT Presentation

Citation preview

Page 1: REKURSION +  ITERATION

REKURSION + ITERATION

Page 2: REKURSION +  ITERATION

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.

Page 3: REKURSION +  ITERATION

Produktion von wunderbaren Zahlen.

Page 4: REKURSION +  ITERATION

Dazu werden natürlich wieder die Regeln (zur Produktion) verwendet.

Diese sind…

Page 5: REKURSION +  ITERATION

--- 3

--- 5

{r; s} ------ wobei rX={1; 2; 3; ...} und sX und r s

r+s

Regel 1, kurz R1

Regel 2, kurz R2

Regel 3, kurz R3

Zu einer Regel, an der die leere Menge beteiligt ist, sagt man auch Axiom.Wir sagen zu den "Produkten" 3 und 5 jeweils Atom.

Page 6: REKURSION +  ITERATION

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)?

Page 7: REKURSION +  ITERATION

Da es für den "Urknall" nur 2 Regeln gibt, kann man

nur R1 und R2 verwenden. Also…

Page 8: REKURSION +  ITERATION

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?

Page 9: REKURSION +  ITERATION

Man darf jetzt beliebige Teilmengen aus D1 auswählen

und auf diese eine Regel anwenden. Was ist die kleinste

Teilmenge in D1?3 5

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 D1 kann man welche Regel anwenden ?

Auf die Menge {3;5} . Dies ergibt das neue Element 3+5 = 8

8

D1

D2

Page 10: REKURSION +  ITERATION

Man darf jetzt beliebige Teilmengen aus D2 auswählen

und auf diese eine Regel anwenden. Was ist die kleinste

Teilmenge in D2?

3 5

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

Page 11: REKURSION +  ITERATION

3 5

3

5

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=13

11 13

Page 12: REKURSION +  ITERATION

3

5 D3

8

Auf die leere Menge als Teilmenge von D3 kann man welche Regeln anwenden? Was ergibt dies für neue Elemente von D4

Regel R1 und R2. Diese ergibt 3 und 5

11 13

3 5

D4

8

11

13

Auf welche weitere Teilmengen von D3 kann man R3 anwenden?Was ergibt das für neue Elemente ?

{3,5} --> 8 {3,8} --> 11

{5,8} --> 13 {3,13} --> 1616 {5,13} --> 18

18

{8,13} --> 21

21 {11,13} --> 2424 {5,11} --> 16

16 {8,11} --> 1919

Page 13: REKURSION +  ITERATION

3

5 D3

8

11 13

3 5

D4

8

11

13 16

18

21

16 19

Dies geht unendlich oft weiter …

Die Vereinigung all dieser Mengen ist die zu konstruierende GesamtmengeD = {3;5;8;11;13; …} der wunderbaren Zahlen

Welche mengentheoretische Beziehung besteht zwischen D0, D1, D2, D3, usw. ?

D0 D1 D2 D3 … D

24

Page 14: REKURSION +  ITERATION

Uns interessiert nun, ob eine Zahl zu der Gesamtmenge D gehört oder nicht. Dazu definiert man die Funktion e (wie evaluate) mit …

e(x) = 1 <==> x D unde(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.

3 5 8

11

13 16

18

21 24

16 19

D4

Page 15: REKURSION +  ITERATION

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?

Page 16: REKURSION +  ITERATION

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

Page 17: REKURSION +  ITERATION

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

Page 18: REKURSION +  ITERATION

D = {3 ; 5 ; 8 ; 11; 13; ...}

3D und 5D ==> ?

Was folgt daraus, d.h. welche Zahl gehört dann auch zu D ?

Page 19: REKURSION +  ITERATION

D = {3 ; 5 ; 8 ; 11; 13; ...} Man sieht sofort:

3D und 5D ==> 3+5D

Page 20: REKURSION +  ITERATION

D = {3 ; 5 ; 8 ; 11; 13; ...} Allgemeiner:rD und sD ==> ?

Was folgt daraus, d.h. welche Zahl gehört dann auch zu D ?

Page 21: REKURSION +  ITERATION

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

Page 22: REKURSION +  ITERATION

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

Page 23: REKURSION +  ITERATION

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

Page 24: REKURSION +  ITERATION

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

Page 25: REKURSION +  ITERATION

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

Page 26: REKURSION +  ITERATION

8D <==> 1D 7D 2D 6D 3D 5D

d.h. in mindestens einer Zerlegung müssen alle 2 Zahlen aus D sein !

Page 27: REKURSION +  ITERATION

8D <==> 1D 7D 2D 6D 3D 5D

bzw. wenn man die Schreibweise mit e(...) verwendet ...

Page 28: REKURSION +  ITERATION

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:

Page 29: REKURSION +  ITERATION

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!

Page 30: REKURSION +  ITERATION

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) ?

1 1

0 0

001

Page 31: REKURSION +  ITERATION

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.

1 1

0 0

001

Page 32: REKURSION +  ITERATION

Die dahinter stehende Struktur kann man anschaulich durch einen sogenannten UND-ODER-Baum darstellen.Dies ist ein Baum, in dem UND-Gatter und ODER-Gatter vorkommen, also folgende Form haben:

Page 33: REKURSION +  ITERATION

..................................... usw. .....................................................

blaue Gebilde : ODER-Gatter

rote Gebilde : UND-Gatter

Page 34: REKURSION +  ITERATION

e(1)e(6) e(2)

e(3)

e(7)

e(1) e(5) e(2)e(4)

e(1) e(3)

e(5) e(4)

e(1) e(3)

10

0

0

00 1

00

00

0

0 1

0

0

110

0 0

jetzt wird von den grünen Blättern ausgehend nach oben hin der Baum ausgwertet.

0

Page 35: REKURSION +  ITERATION

Dies kann man auch etwas mathematischer darstellen:

Page 36: REKURSION +  ITERATION

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} }

Page 37: REKURSION +  ITERATION

Weitere rekursive Berechnungen?

Page 38: REKURSION +  ITERATION

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

Page 39: REKURSION +  ITERATION

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

Page 40: REKURSION +  ITERATION

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

Page 41: REKURSION +  ITERATION

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

Page 42: REKURSION +  ITERATION

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

Page 43: REKURSION +  ITERATION

7

1, 6 3, 42, 5

1, 50

00 0

0

1 0

1

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, 310

1, 3100

e(4)=0*1

e(4)=0*10

Page 44: REKURSION +  ITERATION

Insgesamt ergibt dies die folgende mathematische Formel:

Page 45: REKURSION +  ITERATION

// Kandidatenmenge leer:Fall: K(x) = ==> e(x) = 0

// x kommt direkt nach dem Urknall:Fall: K(x) ==> e(x) = 1

Fall: sonste(x) = e(x1) * e(x2) {x1,x2}K(x)

Page 46: REKURSION +  ITERATION

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

Page 47: REKURSION +  ITERATION

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:

1 14 2 13 3 12 4 11 5 10 6 9 7 8

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) =

Page 48: REKURSION +  ITERATION

...int sum=0;

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

Page 49: REKURSION +  ITERATION

Annahme: Das Feld v ist sehr groß.

Wie könnte man die Laufzeit (Performance) des Programms verbessern ?

Beachten Sie dazu Folgendes:

Page 50: REKURSION +  ITERATION

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 0WAHR entspricht ≥ 1

Page 51: REKURSION +  ITERATION

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.

Page 52: REKURSION +  ITERATION

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.

Page 53: REKURSION +  ITERATION

Aufgabe:Erstellen Sie die Funktion

eRek(int zahl), die berechnet, ob eine Zahl zu den

wunderbaren Zahlen gehört (oder nicht)

Page 54: REKURSION +  ITERATION

Lösung:

Page 55: REKURSION +  ITERATION

#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;}

Page 56: REKURSION +  ITERATION

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;}

Page 57: REKURSION +  ITERATION

Weiteres Beispiel:Regulärer Ausdruck

Page 58: REKURSION +  ITERATION

Zuerst ein paar Definitionen

Page 59: REKURSION +  ITERATION

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.

Page 60: REKURSION +  ITERATION

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

Beispiel:| abca | = 4

Page 61: REKURSION +  ITERATION

Beispiele von Zeichenkette über A

und keinen Zeichenketten über A

Page 62: REKURSION +  ITERATION

cabababamit mammaaaaaahhh(a+b)abbaacbacbacbacbcbbacbac

ZK über A

Was sind Zeichenketten über dem Alphabet A, was nicht ?

ZK über A

keine ZK über A

keine ZK über A

keine ZK über A

keine ZK über A

ZK über A

ZK über A

Page 63: REKURSION +  ITERATION

Jetzt zu den regulären Ausdrücken

Page 64: REKURSION +  ITERATION

Für das Alphabet A gilt im Folgenden:

A = {a, b, c}

Page 65: REKURSION +  ITERATION

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* ?

Page 66: REKURSION +  ITERATION

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

Page 67: REKURSION +  ITERATION

a | bbedeutet 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 ?

Page 68: REKURSION +  ITERATION

X = {a, b}

Page 69: REKURSION +  ITERATION

a* | b*

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

Page 70: REKURSION +  ITERATION

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

Dies könnte man mengentheoretisch auch schreiben als ...

Page 71: REKURSION +  ITERATION

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

Page 72: REKURSION +  ITERATION

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)* ?

Page 73: REKURSION +  ITERATION

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

Page 74: REKURSION +  ITERATION

a c* a

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

Page 75: REKURSION +  ITERATION

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 ...

Page 76: REKURSION +  ITERATION

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

Page 77: REKURSION +  ITERATION

Aufgabe:Geben Sie die Regeln an, die die Zeichenketten der

Form a* erstellen.

Page 78: REKURSION +  ITERATION

--- a

{z} ----- wobei zX=Menge aller az Zeichenketten über A

Regel 1, kurz R1

Regel 2, kurz R2

Page 79: REKURSION +  ITERATION

Aufgabe:Geben Sie die MengenD0, D1, D2, D3, ... an.

Page 80: REKURSION +  ITERATION

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

Page 81: REKURSION +  ITERATION

Wie kann man rekursiv berechnen, ob eine

Zeichenkette ein regulärer Ausdruck der Form a* ist

oder nicht ?

Page 82: REKURSION +  ITERATION

Schauen wir uns dazu die Formel von vorher an:

Page 83: REKURSION +  ITERATION

// Kandidatenmenge leer:Fall: K(x) = ==> e(x) = 0

// x kommt direkt nach dem Urknall:Fall: K(x) ==> e(x) = 1

Fall: sonste(x) = e(x1) * e(x2) {x1,x2}K(x)

Page 84: REKURSION +  ITERATION

Fall: sonste(x) = e(x1) * e(x2) {x1,x2}K(x)

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

Page 85: REKURSION +  ITERATION

// Kandidatenmenge leer:Fall: K(x) = ==> e(x) = 0

// x kommt direkt nach dem Urknall:Fall: K(x) ==> e(x) = 1

Fall: sonste(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.

Page 86: REKURSION +  ITERATION

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

Page 87: REKURSION +  ITERATION

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:

Page 88: REKURSION +  ITERATION

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:

Page 89: REKURSION +  ITERATION

Aufgabe:Erstellen Sie die Funktion

eRek(...) die berechnet, ob eine

Zeichenkette ein regulärer Ausdruck der Form a* ist

oder nicht.

Page 90: REKURSION +  ITERATION

#include "stdafx.h"#include <string.h>

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.

Page 91: REKURSION +  ITERATION

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;}

Page 92: REKURSION +  ITERATION

Weiteres Beispiel:Terme

Page 93: REKURSION +  ITERATION

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.

Page 94: REKURSION +  ITERATION

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

Beispiel:| baba | = 4

Page 95: REKURSION +  ITERATION

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

Page 96: REKURSION +  ITERATION

Unter einem mathematischen Term verstehen wir hier :

Page 97: REKURSION +  ITERATION

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

Page 98: REKURSION +  ITERATION

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

Page 99: REKURSION +  ITERATION

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

Page 100: REKURSION +  ITERATION

--- a

--- b

{z; s} ------ wobei zX und sX

(z+s)

Regel 1, kurz R1

Regel 3, kurz R3

Regel 2, kurz R2

Page 101: REKURSION +  ITERATION

Aufgabe:Geben Sie die MengenD0, D1, D2, D3 an.

Page 102: REKURSION +  ITERATION

D0 =

Page 103: REKURSION +  ITERATION

D1 = {a, b}

Page 104: REKURSION +  ITERATION

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

Page 105: REKURSION +  ITERATION

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)) }

Page 106: REKURSION +  ITERATION

Wie kann man rekursiv berechnen, ob eine

Zeichenkette ein Term ist oder nicht ?

Page 107: REKURSION +  ITERATION

Schauen wir uns dazu die Formel von vorher an:

Page 108: REKURSION +  ITERATION

Fall: K(x) = ==> e(x) = 0Fall: K(x) ==>e(x) = 1Fall: sonste(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) = ?

Page 109: REKURSION +  ITERATION

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

Page 110: REKURSION +  ITERATION

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:

Page 111: REKURSION +  ITERATION

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}

Page 112: REKURSION +  ITERATION

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

Page 113: REKURSION +  ITERATION

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}

Page 114: REKURSION +  ITERATION

Weiteres Beispiel:x= a+b+c)

K(x) = ?

Page 115: REKURSION +  ITERATION

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.

Page 116: REKURSION +  ITERATION

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) = ?

Page 117: REKURSION +  ITERATION

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.

Page 118: REKURSION +  ITERATION

Weiteres Beispiel:x= ae(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

Page 119: REKURSION +  ITERATION

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) = ?

Page 120: REKURSION +  ITERATION

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) =

Page 121: REKURSION +  ITERATION

((a+(b+a)+b)

(a , (b+a)+b (a+(b+a) , b (a+(b , a)+b0 0 0

0

10

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+a1 0

=e((a+(b+a))

0

a+(b , a

1*0+0*1

Page 122: REKURSION +  ITERATION

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

Page 123: REKURSION +  ITERATION

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:

((a b)+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)+(a c)

Feld v geht hier weiter

Page 124: REKURSION +  ITERATION

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:

((a b)+c)+(a+c) ((a+b) c)+(a+c)

((a+b)+c) (a+c) ((a+b)+c)+(a c)

Diese Indizes i1 bis i4 könnte man in einer for-Schleife ermitteln.

↑ ↑ ↑ ↑Index(Stelle) i4

Index(Stelle) i3Index(Stelle) i1

Index(Stelle) i2

Mit i1 bis i4 werden die Indizes der Rechenzeichen bezeichnet.

Page 125: REKURSION +  ITERATION

(((a+b)+c)+(a+c))

((a b)+c)+(a+c) ((a+b) c)+(a+c)

((a+b)+c) (a+c) ((a+b)+c)+(a c)

↑ ↑ ↑ ↑ 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

Page 126: REKURSION +  ITERATION

(((a+b)+c)+(a+c))

((a b)+c)+(a+c) ((a+b) c)+(a+c)

((a+b)+c) (a+c) ((a+b)+c)+(a c)

↑ ↑ ↑ ↑ 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 ...

Page 127: REKURSION +  ITERATION

Aufgabe:Erstellen Sie die Funktion

eRek(…), die berechnet, ob eine Zeichenkette ein Term

ist oder nicht.

Page 128: REKURSION +  ITERATION

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

Page 129: REKURSION +  ITERATION

else{ // Zerlegungen versuchen for(i=begin+1; i<end; i++){ if(len<=3) break; else{ if(string[i]=='+' && string[begin]=='(' && string[end]==')'){ // sonst erg= eRek(string, begin+1, i-1) * eRek(string, i+1, end-1); if(erg==1){ return 1; } } } } erg=0; // K(zahl)=

} return erg;}