Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Entwurfsprinzip 4.5.13 (Invarianten als Abschwächung <strong>der</strong> Nachbedingung)<br />
Eine Invariante kann durch Abschwächung <strong>der</strong> Nachbedingung post auf folgende Arten erzeugt werden.<br />
Entfernen eines Konjunktionsgliedes: Wenn post die Form A ∧B ∧C hat, dann kann B entfernt<br />
werden und A ∧B als Invariante gewählt werden. B ist dann in Kandidat für die Abbruchbedingung.<br />
Ersetzen einer Konstanten durch eine Variable:<br />
In <strong>der</strong> Nachbedingung sum= q<br />
k=p ak kann zum Beispiel die Konstante q durch eine neue Variable<br />
i ersetzt werden, <strong>der</strong>en Wertebereich natürlich beschränkt werden muß.<br />
sum= q<br />
k=p ak ≡ sum= i k=p ak ∧ i=q<br />
Erweiterung des Wertebereichs einer Variablen:<br />
In <strong>der</strong> obigen Bedingung kann i=q erweitert werden zu p≤i≤q.<br />
Erweiterung durch Disjunktion: Als Invariante kann post ∨A gewählt werden, wobei A eine beliebige<br />
Bedingung ist.<br />
Die ersten drei Methoden sind ziemlich sinnvoll, während die letzte nur relativ selten eingesetzt wird. Meist<br />
tritt eine Kombination <strong>der</strong> Methoden auf. In Beispiel 4.5.11 haben wir z.B. erst eine Konstante durch eine<br />
Variable ersetzt und dann den Wertebereich dieser Variablen ausgedehnt. Eine Reihe weiterer Beispiele und<br />
ergänzen<strong>der</strong> Hinweise findet man in [Gries, 1981, Kapitel 16].<br />
Die Variante einer Schleife erfüllt zwei Aufgaben. Einerseits soll sie sicherstellen, daß die Schleife überhaupt<br />
terminiert. Zum an<strong>der</strong>en liefert sie auch eine obere Schranke für die Anzahl <strong>der</strong> Schritte, die bis zum Abbruch<br />
durchgeführt werden. Für ein und dasselbe Problem gibt es daher sehr verschiedene Varianten – je nachdem<br />
ob das Interesse eines Programmierers nur in <strong>der</strong> Terminierung o<strong>der</strong> auch in einer effizienten Lösung liegt.<br />
Auch wenn die Variante formal nur ein Integer-Ausdruck ist, beschreibt sie dennoch eine Eigenschaft des<br />
zu erzeugenden Programms. So ist z.B. bei unserem Programm zur Summierung von Folgenelementen die<br />
Variante die Anzahl <strong>der</strong> noch nicht aufsummierten Elemente, die in jedem Schritt geringer werden soll. Die<br />
Tatsache, daß diese Anzahl stets positiv ist, ergibt sich aus <strong>der</strong> Invarianten. Es lohnt sich daher, diese Eigenschaft<br />
zunächst informal zu beschreiben und dann mithilfe <strong>der</strong> bisher formulierten Eigenschaften in einen<br />
Integer-Ausdruck umzuwandeln.<br />
Entwurfsprinzip 4.5.14 (Strategie zum Erzeugen <strong>der</strong> Variante)<br />
Beschreibe die Variante zunächst informal als eine Eigenschaft, die sich aus <strong>der</strong> Invariante und <strong>der</strong><br />
Spezifikation ergibt. Formalisiere sie dann als Integer-Ausdruck.<br />
4.5.4 Sinnvoller Einsatz von Rekursion<br />
Wir haben im Abschnitt 4.3.10 gesehen, daß <strong>der</strong> Effekt von Schleifen genauso gut durch die Deklaration rekursiver<br />
Routinen erreicht werden kann. Rekursion ist ein nützliches Hilfsmittel, das unbedingt zum Repertoire<br />
eines guten Programmierers gehören sollte, da manche Probleme sich auf diese Art sehr viel eleganter lösen<br />
lassen als durch Schleifen.<br />
Es gibt zwei wichtige Programmierstrategien, bei denen Rekursion beson<strong>der</strong>s häufig auftritt. Man kann eine<br />
Aufgabenstellung dadurch lösen, daß man einen Teil davon auf ein bekanntes Problem zurückführt und den<br />
Rest als einfachere Variante <strong>der</strong> ursprünglichen Aufgabenstellung ansieht. Man kann aber auch das Problem<br />
so aufteilen, daß beide Teile einfachere Varianten <strong>der</strong> ursprünglichen Aufgabenstellung sind. Diese Strategie ist<br />
unter dem Namen Divide&Conquer (Teilen und Erobern) bekannt geworden. Wir wollen beide kurz anhand<br />
von Beispielen erläutern.