Informatik 1 - Mitschriften von Klaas Ole Kürtz

Informatik 1 - Mitschriften von Klaas Ole Kürtz Informatik 1 - Mitschriften von Klaas Ole Kürtz

28.03.2014 Aufrufe

2.3.2 if Eine weitere (eigentlich nicht notwendige) Sonderform zur Fallunterscheidung ist if: (if ) ≈ (cond ( ) (else )). 2.3.3 and, or, not • (and ) ⇔ p 1 ∧ p 2 • (or ) ⇔ p 1 ∨ p 2 • (not ) ⇔ ¬p 2.3.4 Beispiel: Quadratwurzelberechnung nach Newton Mathematische Wurzelfunktion y = √ x mit y ≥ 0 und y 2 = x ist eine präzise Funktion, aber nicht effektiv und damit kein Algorithmus. Als Berechnungsverfahren dient das Newtonsche Iterationsverfahren. Gegeben ist eine Schätzung für y, ausgegeben wird als bessere Schäzung der Mittelwert aus y und x y . Formulierung: (define (wurzel-iter y x) (if (gut-genug? y x) y (wurzel-iter (verbessern y x) x))) (define (verbessern y x) (mittelwert y (/ x y))) (define (mittelwert x y) (/ (+ x y) 2)) (define (gut-genug? y x) (< (abs (- (quadrat y) x)) 0.001)) (define (quadrat x) (* x x)) (define (abs x) (if (< x 0) (- x) x)) (define (wurzel x) (wurzel-iter 1 x)) Anmerkungen: • numerische Anwendung möglich • keine iterativen Konstrukte (Schleifen) notwendig • lediglich Prozeduraufrufe, also Schleifen ≈ Rekursion • Effizienz: kein Problem (Implementierung als Schleife) Vorgehensweise: • Problem zerlegen in Teilprobleme (logische Einheiten) • Teilprobleme als Prozeduren implementieren • Prozeduren erfüllen bestimmte Aufgaben, das wie ist dabei uninteressant (prozedurale Abstraktion, BlackBox) 10

• top-down- bzw. -bottom-up-Entwurf, Praxis: Mischung aus beiden Verfahren 2.4 Namensgebung • Prozedurnamen sind wichtig (Abstraktion), auch um Prozeduren unabhängig zu entwickeln • Namen von lokalen Variablen sind nur intern relevant und damit relativ unwichtig • formale Parameter sind gebundene Variablen, Gegeteil: freie Variablen (Bspl abs, quadrat, gut-genug?) • Geltungsbereich, Gültigkeitsbereich: Ausdruck(smenge), in der Variablenbindung bekannt sind (Bspl: für (define (f x) ) ist der Geltungsbereich von x) • Blockstruktur: Bisher: alle Funktionen etc. auf gleicher Ebene definiert, daher gleich bekannt, aber der Name kann von anderen Programmierern nicht mehr genutzt werden (bzw. diese definieren es um, es kommt zu Problemen). Daher: Blockstruktur, d.h. Hilfsoperationen »verstecken«: (define (wurzel x) . (define (wurzel-iter y x) (...)) . (define (verbessern y x) (...)) ... . (wurzel-iter 1 x)) • innere Definitionen sind damit außerhalb von wurzel unsichtbar, bessere Modularisierung (wurzel als BlackBox) • Vorteil: Wurzel-Parameter x gültig in allen lokalen Definitionen, d.h. Übergabe der Variablen unnötig: (define (wurzel x) (define (gut-genug? y) (< (abs (- (quadrat y) x))) 0.0001) (define (verbessern y) (mittelwert y (/ x y))) (define (wurzel-iter y) (if (gut-genug? y) y (wurzeliter (verbessern y)))) (wurzel-iter 1)) • Lexikalische (statische) Bindung: Namen beziehen sich auf den nächsten umgebenden Block, in dem sie gebunden sind. Damit sind gleiche Namen für unterschiedliche Objekte möglich. 11

2.3.2 if<br />

Eine weitere (eigentlich nicht notwendige) Sonderform zur Fallunterscheidung<br />

ist if: (if ) ≈ (cond ( ) (else )).<br />

2.3.3 and, or, not<br />

• (and ) ⇔ p 1 ∧ p 2<br />

• (or ) ⇔ p 1 ∨ p 2<br />

• (not ) ⇔ ¬p<br />

2.3.4 Beispiel: Quadratwurzelberechnung nach Newton<br />

Mathematische Wurzelfunktion y = √ x mit y ≥ 0 und y 2 = x ist eine präzise<br />

Funktion, aber nicht effektiv und damit kein Algorithmus. Als Berechnungsverfahren<br />

dient das Newtonsche Iterationsverfahren. Gegeben ist eine Schätzung<br />

für y, ausgegeben wird als bessere Schäzung der Mittelwert aus y und x y .<br />

Formulierung:<br />

(define (wurzel-iter y x) (if (gut-genug? y x) y (wurzel-iter (verbessern<br />

y x) x)))<br />

(define (verbessern y x) (mittelwert y (/ x y)))<br />

(define (mittelwert x y) (/ (+ x y) 2))<br />

(define (gut-genug? y x) (< (abs (- (quadrat y) x)) 0.001))<br />

(define (quadrat x) (* x x))<br />

(define (abs x) (if (< x 0) (- x) x))<br />

(define (wurzel x) (wurzel-iter 1 x))<br />

Anmerkungen:<br />

• numerische Anwendung möglich<br />

• keine iterativen Konstrukte (Schleifen) notwendig<br />

• lediglich Prozeduraufrufe, also Schleifen ≈ Rekursion<br />

• Effizienz: kein Problem (Implementierung als Schleife)<br />

Vorgehensweise:<br />

• Problem zerlegen in Teilprobleme (logische Einheiten)<br />

• Teilprobleme als Prozeduren implementieren<br />

• Prozeduren erfüllen bestimmte Aufgaben, das wie ist dabei uninteressant<br />

(prozedurale Abstraktion, BlackBox)<br />

10

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!