Algorithmen mit Wiederholungen

Wiederholungsstruktur mit Endbedingung

Einführungsbeispiel

DAS HERON-Verfahren

Nach Heron von Alexandria  wird ein Verfahren zur Approximation von Quadratwurzeln zugeschrieben.

xn+1 = 1/2 (xn + a/ xn)

a ... Radikant; x1... Startwert

Beispiel, um es besser zu verstehen  

Gesucht ist die Wurzel aus 20 (20 =  5 · 4), also Startwert a = 20

 

Annäherung   b

a / b
Mittelwert als Bruch

Näherungswert

(auf 4 Dezimalen)

1. 5 20 / 5 = 4 9/2 (= 4,5) 4,5000
2. 9 / 2 20 / (9 / 2)) = 40/9 (9 / 2  +  40 / 9) / 2  =  171 / 36 4,7500
3. 171/36 20 / (171/36) = 720 / 171 (171² + 36 · 720) / (36 · 171 · 2)  4,4803
4. (171² + 36 · 720) / (36 · 171 · 2)  20 / (171² + 36 · 720) / (36 · 171 · 2) 4,4721

 Zusammenfassend: Mit dem Heronverfahren lassen sich Wurzeln näherungsweise bestimmen.

 Algorithmus

Heron(a) 
Hilfsvariable:  x, y, xneu, yneu;  {+++ Vereinbarung von lokalen Hilfsvariablen +++} 
begin x:=a; y:=1; {+++  := Wertzuweisung+++} 

Solange |x^2 - a| > 0.000001 tue folgendes:

 
   [ xneu := (x+y)/2;  {+++eckige Klammern legen den Gültigkeitsbereich fest+++}
  yneu := a/xneu;  
  x := xneu;  
   y := yneu ];  
  Rueckgabe x  
end    

 Struktogramm

 

Syntax

Die Wiederholungsanweisung mit Endbedingung ermöglicht es,  Anweisungen mehrfach auszufahren und zwar solange bis die Schleifenbedingung am Ende erfüllt ist.

REPEAT <Anweisung> UNTIL <Bedingung>

Quelltext

Program Heron_Verfahren;
uses crt; 
var 	a, x, y, xneu, yneu, epsilon: real; 
	k: integer; 
begin {+++ Heron +++} 
	clrscr;
	writeln; 
	writeln('          Das Heron-Verfahren '); 
	writeln('    zur Bestimmung der Quadratwurzel'); 
	writeln; 
	write('   Es soll die Wurzel aus a = '); read(a); writeln('   bestimmt werden'); {+++ Eingabe +++}
	write('   Toleranz: epsilon = '); readln(epsilon);
	k := 0; x := a; y := 1; 
		while abs(x*x - a) > epsilon do 
			begin 
				writeln(k : 4, x : 13 : 8, y : 12 : 8); 
				{+++ formatierte Ausgabe +++}
				k := k+1; xneu := (x + y) / 2; 
				yneu := a / xneu; x := xneu; y := yneu; 
			end;
		writeln(k : 4, x : 13 : 8, y : 12 : 8);
		writeln('Wurzel(a) = ', x : 12 : 8); 27: 
end.{+++ Heron +++}