22.08.2013 Aufrufe

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!