1.27k likes | 1.44k Views
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.
E N D
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.
Dazu werden natürlich wieder die Regeln (zur Produktion) verwendet.Diese sind…
---3 ---5 {r; s} ------wobei rX={1; 2; 3; ...} und sX und r sr+s Regel 1, kurz R1 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. Regel 2, kurz R2 Regel 3, kurz R3
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)?
Da es für den "Urknall" nur 2 Regeln gibt, kann man nur R1 und R2 verwenden. Also…
Mit der leeren Menge beginnt alles Aus dieser wird dann wieder (mit Hilfe von R1 und R2) die Menge D1 gebastelt 3 5 Wie sieht die Menge D2 aus? Wie wird sie gebastelt?
Man darf jetzt beliebige Teilmengen aus D1 auswählen und auf diese eine Regel anwenden. Was ist die kleinste Teilmenge in D1? 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 ? 8 Auf die Menge {3;5} . Dies ergibt das neue Element 3+5 = 8 D2
Man darf jetzt beliebige Teilmengen aus D2 auswählen und auf diese eine Regel anwenden. Was ist die kleinste Teilmenge in D2? 3 5 D2 8 Das ist die leere Menge. Welche Regeln kann man darauf anwenden? 5 R1 und R2, also bekommt man die Elemente… 3 8 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 D3
Auf welche weitere Teilmengen von D2 kann man welche Regeln anwenden ? 3 5 D2 Auf die Mengen {3;8}, {5;8} . Dies ergibt dann die neuen Elemente 3+8=11, 5+8=13 8 Dies geht unendlich oft weiter … Die Vereinigung all dieser Mengen ist die zu konstruierende GesamtmengeD = {3;5;8;11;13; …} der wunderbaren Zahlen 5 3 8 11 13 Welche mengentheoretische Beziehung besteht zwischen D0, D1, D2, D3, usw. ? D0D1D2D3 … D D3
Uns interessiert nun, ob eine Zahl zu der Gesamtmenge D gehört oder nicht. Dazu definiert man die Funktion e (wie evaluate) mit … 5 3 8 11 13 e(x) = 1 <==> x D unde(x) = 0 <==> x D D3 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.
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?
Wiederholt werden aus der alten Menge die neuen Elemente berechnet und dieser Menge hinzugefügt. Dies muß hinreichend oft gemacht werden.
Wie kann dies rekursiv realisiert werden …?Beachten Sie dazu folgende Informationen ...
D = {3 ; 5 ; 8 ; 11; 13; ...} 3D und 5D ==> ? Was folgt daraus, d.h. welche Zahl gehört dann auch zu D ?
D = {3 ; 5 ; 8 ; 11; 13; ...} Man sieht sofort: 3D und 5D ==> 3+5D
D = {3 ; 5 ; 8 ; 11; 13; ...} Allgemeiner: rD und sD ==> ? Was folgt daraus, d.h. welche Zahl gehört dann auch zu D ?
D = {3 ; 5 ; 8 ; 11; 13; ...} Allgemeiner: rD und sD ==> r+sD
D = {3 ; 5 ; 8 ; 11; 13; ...} Gilt dies auch umgekehrt ?D.h: r+sD ==> rD und sD Wenn dies nicht gelten sollte, geben Sie bitte ein Gegenbeispiel an.
D = {3 ; 5 ; 8 ; 11; 13; ...} r+sD ==> rD und sD Diese Aussage ist falsch, denn aus 8D folgt NICHT 1D und 7D
D = {3 ; 5 ; 8 ; 11; 13; ...} r+sD ==> rD und sD Kann man diese Aussage so abändern, daß sie korrekt wird ? Bedenken Sie dazu, daß zwar ...
D = {3 ; 5 ; 8 ; 11; 13; ...} 8D ==> 1D und 7D falsch, aber 8D ==> 3D und 5D richtig ist.
8D <==> 1D 7D 2D 6D 3D 5D d.h. in mindestens einer Zerlegung müssen alle 2 Zahlen aus D sein !
8D <==> 1D 7D 2D 6D 3D 5D bzw. wenn man die Schreibweise mit e(...) verwendet ...
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:
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!
e(8) = e(1) * e(7) + e(2) * e(6) + e(3) * e(5) 0 0 1 0 0 1 1 Welchen Wert haben e(1), ..., e(7) und wie berechnet man daraus e(8) ?
e(8) = e(1) * e(7) + e(2) * e(6) + e(3) * e(5) 0 0 1 0 0 1 1 e(8) wird rekursiv, d.h. durch die Verwendung von "vorigen" Werten e(1), ..., e(7) berechnet.
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:
..................................... usw. ..................................................... blaue Gebilde : ODER-Gatter rote Gebilde : UND-Gatter
0 e(7) 0 0 0 0 0 0 e(6) e(4) e(2) e(5) e(1) e(3) 0 1 1 0 0 0 0 e(4) e(3) e(1) e(5) e(1) e(2) 0 1 0 0 0 0 jetzt wird von den grünen Blättern ausgehend nach oben hin der Baum ausgwertet. e(3) e(1) 0 1
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} }
e(5) = ? Wie berechnet man aber e(5) rekursiv, d.h. kann e(5) durch Verwendung von e(1), ..., e(4) berechnet werden ?
Nein, denn 5wird direkt aus der leeren Menge produziert Also ist e(5) = 1
e(2) = ? Wie berechnet man aber e(2) rekursiv, d.h. kann e(2) durch Verwendung von e(1) berechnet werden ?
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
Rekursive Berechnung von e(7) Aus welchen Elementen aus D könnte die 7 theoretisch produziert worden sein?
7 e(7)= 0*0+0*1+1*0 0 2, 5 1, 6 3, 4 0 e(6)= 0*1+0*0 1 0 1 0 0 e(4)= 0*1 1, 3 2, 4 1, 5 0 1 e(4)= 0*1 1 0 0 0 1, 3 0 1 Wie groß ist jeweils e(b), d.h. welchen Wert haben die roten Blätter ?
// 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)
Bevor wir die zugehörige Funktion e(...) implementieren, machen wir noch ein paar Überlegungen ...
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(15)= 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)
...int sum=0; for(i=1;i<15;i=i+2){ sum = e(i)*e(15-i)+sum; } ...
Annahme: Das Feld v ist sehr groß. Wie könnte man die Laufzeit (Performance) des Programms verbessern ?Beachten Sie dazu Folgendes:
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
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.
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.