home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
modula2
/
library
/
fst
/
modula3
/
function.mod
< prev
next >
Wrap
Text File
|
1993-07-28
|
4KB
|
123 lines
MODULE Function;
(* Programm zum Berechnen der Fibunacci- und Ackermannfunktion
Definition der Fibunaccifunktion: f(0) = 0;
f(1) = 1;
f(i+1) = f(i) + f(i-1);
Definition der Ackermannfunktion:
a(n,m) = m + 1 ,falls n=0
a(n,m) = a(n-1,1) ,falls m=0
a(n-1,a(n,m-1))) ,sonst
Beispiele: a(1,1) = 3,
a(2,2) = 7,
a(3,3) =61,
a(4,2) ist mit normalen Rechnern kaum darzustellen, da das
Ergebnis 19729 Stellen besitzt.
a(4,4) ist größer als ((10^10)^10)^19000
*)
FROM InOut IMPORT WriteLn,WriteString,ReadCard,Done,WriteCard,ReadString;
VAR n,a,b:CARDINAL;
func_x:CHAR; (* Eingabe, welche function berechnet werden soll *)
jn :CHAR; (* Weitere Berechnungen? *)
PROCEDURE FibuRec(n:CARDINAL):CARDINAL;
(* errechnet die FibunacciZahl von n rekursiv *)
BEGIN
IF n<=1 THEN RETURN n
ELSE RETURN(FibuRec(n-1)+FibuRec(n-2));
END
END FibuRec;
PROCEDURE FibuIt(n:CARDINAL):CARDINAL;
(* errechnet die FibunacciZahl von n iterativ *)
VAR a,b,i:CARDINAL;
BEGIN
IF n=0 THEN RETURN(0) END;
a:=1; b:=0;
FOR i:= 1 TO (n-1) DO
a:=a+b;
b:=a-b;
END;
RETURN a;
END FibuIt;
PROCEDURE Ackermann(a,b:CARDINAL):CARDINAL;
(* Berechnung der Ackermannfunktion *)
BEGIN
IF a=0 THEN RETURN b+1
ELSE IF b=0 THEN RETURN Ackermann(a-1,1);
ELSE RETURN Ackermann(a-1,Ackermann(a,b-1));
END (* IF *)
END (* IF *)
END Ackermann;
BEGIN
WriteString('Dieses Programm berechnet einige Funktionen');
WriteLn;
REPEAT
WriteString('Bitte eingeben, welche Funktion berechnet werden soll: ');
WriteLn;
WriteString('"1": Berechnung der Fibunaccizahl (recursiv). ');
WriteLn;
WriteString('"2": Berechnung der Fibunaccizahl (iterativ). ');
WriteLn;
WriteString('"3": Berechnung der Ackermannfunktion (rekursiv). ');
WriteLn;
ReadString(func_x);
CASE func_x OF
"1" :WriteLn;
REPEAT
WriteString('Eingabe von n: ');
ReadCard(n);
UNTIL (n>=0) AND Done;
WriteLn;
WriteString('Die Fibunacci-Zahl von ');
WriteCard(n,3);
WriteString(' = ');
WriteCard(FibuRec(n),2);
WriteLn; WriteLn; WriteLn; |
"2" :WriteLn;
REPEAT
WriteString('Eingabe von n: ');
ReadCard(n);
UNTIL (n>=0) AND Done;
WriteLn;
WriteString('Die Fibunacci-Zahl von ');
WriteCard(n,3);
WriteString(' = ');
WriteCard(FibuIt(n),2);
WriteLn;WriteLn;WriteLn; |
"3" :WriteLn;
REPEAT
WriteString('Eingabe von n: ');
ReadCard(a);
UNTIL (a>=0) AND Done;
WriteLn;
REPEAT
WriteString('Eingabe von m: ');
ReadCard(b);
UNTIL (b>=0) AND Done;
WriteLn;
WriteString(' Ackermann(');
WriteCard(a,2);
WriteString(',');
WriteCard(b,2);
WriteString(')');
WriteString(' = ');
WriteCard(Ackermann(a,b),5);
WriteLn; WriteLn;
ELSE WriteString('Falsche Eingabe !! ');
END; (* CASE *)
WriteLn; WriteLn;
WriteString(' Soll noch eine Berechnung vorgenommen werden? ');
WriteLn;
WriteString('[J]a oder [N]ein : ');
ReadString(jn);
WriteLn; WriteLn; WriteLn;
UNTIL (jn="N") OR (jn="n");
END Function.