home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / modula2 / library / fst / modula3 / function.mod < prev    next >
Text File  |  1993-07-28  |  4KB  |  123 lines

  1. MODULE Function;
  2.  
  3. (* Programm zum Berechnen der Fibunacci- und Ackermannfunktion
  4.    Definition der Fibunaccifunktion: f(0) = 0;
  5.                                      f(1) = 1;
  6.                                      f(i+1) = f(i) + f(i-1);
  7.    Definition der Ackermannfunktion:
  8.       a(n,m) = m + 1     ,falls n=0
  9.       a(n,m) = a(n-1,1)  ,falls m=0
  10.       a(n-1,a(n,m-1)))   ,sonst
  11.      Beispiele: a(1,1) = 3,
  12.                 a(2,2) = 7,
  13.                 a(3,3) =61,
  14.        a(4,2) ist mit normalen Rechnern kaum darzustellen, da das
  15.        Ergebnis 19729 Stellen besitzt.
  16.        a(4,4) ist größer als ((10^10)^10)^19000
  17. *)
  18.  
  19. FROM InOut IMPORT WriteLn,WriteString,ReadCard,Done,WriteCard,ReadString;
  20.  
  21. VAR n,a,b:CARDINAL;
  22.     func_x:CHAR;  (* Eingabe, welche function berechnet werden soll *)
  23.     jn    :CHAR;  (* Weitere Berechnungen? *)
  24.  
  25. PROCEDURE FibuRec(n:CARDINAL):CARDINAL;
  26. (* errechnet die FibunacciZahl von n rekursiv *)
  27.   BEGIN
  28.     IF n<=1 THEN RETURN n
  29.             ELSE RETURN(FibuRec(n-1)+FibuRec(n-2));
  30.     END
  31.   END FibuRec;
  32.  
  33. PROCEDURE FibuIt(n:CARDINAL):CARDINAL;
  34. (* errechnet die FibunacciZahl von n iterativ *)
  35.   VAR a,b,i:CARDINAL;
  36.   BEGIN
  37.     IF n=0 THEN RETURN(0) END;
  38.     a:=1; b:=0;
  39.     FOR i:= 1 TO (n-1) DO
  40.       a:=a+b;
  41.       b:=a-b;
  42.     END;
  43.     RETURN a;
  44.   END FibuIt;
  45.  
  46. PROCEDURE Ackermann(a,b:CARDINAL):CARDINAL;
  47. (* Berechnung der Ackermannfunktion *)
  48.   BEGIN
  49.     IF a=0 THEN RETURN b+1
  50.            ELSE IF b=0 THEN RETURN Ackermann(a-1,1);
  51.                        ELSE RETURN Ackermann(a-1,Ackermann(a,b-1));
  52.                 END   (* IF *)
  53.     END   (* IF *)
  54.   END Ackermann;
  55.  
  56. BEGIN
  57.   WriteString('Dieses Programm berechnet einige Funktionen');
  58.   WriteLn;
  59.   REPEAT
  60.     WriteString('Bitte eingeben, welche Funktion berechnet werden soll: ');
  61.     WriteLn;
  62.     WriteString('"1": Berechnung der Fibunaccizahl (recursiv). ');
  63.     WriteLn;
  64.     WriteString('"2": Berechnung der Fibunaccizahl (iterativ). ');
  65.     WriteLn;
  66.     WriteString('"3": Berechnung der Ackermannfunktion (rekursiv). ');
  67.     WriteLn;
  68.     ReadString(func_x);
  69.     CASE func_x OF
  70.       "1" :WriteLn;
  71.            REPEAT
  72.              WriteString('Eingabe von n: ');
  73.              ReadCard(n);
  74.            UNTIL (n>=0) AND Done;
  75.            WriteLn;
  76.            WriteString('Die Fibunacci-Zahl von ');
  77.            WriteCard(n,3);
  78.            WriteString(' = ');
  79.            WriteCard(FibuRec(n),2);
  80.            WriteLn; WriteLn; WriteLn;  |
  81.  
  82.       "2" :WriteLn;
  83.            REPEAT
  84.              WriteString('Eingabe von n: ');
  85.              ReadCard(n);
  86.            UNTIL (n>=0) AND Done;
  87.            WriteLn;
  88.            WriteString('Die Fibunacci-Zahl von ');
  89.            WriteCard(n,3);
  90.            WriteString(' = ');
  91.            WriteCard(FibuIt(n),2);
  92.            WriteLn;WriteLn;WriteLn;  |
  93.       "3" :WriteLn;
  94.            REPEAT
  95.              WriteString('Eingabe von n: ');
  96.              ReadCard(a);
  97.            UNTIL (a>=0) AND Done;
  98.            WriteLn;
  99.            REPEAT
  100.              WriteString('Eingabe von m: ');
  101.              ReadCard(b);
  102.            UNTIL (b>=0) AND Done;
  103.            WriteLn;
  104.            WriteString(' Ackermann(');
  105.            WriteCard(a,2);
  106.            WriteString(',');
  107.            WriteCard(b,2);
  108.            WriteString(')');
  109.            WriteString('  =  ');
  110.            WriteCard(Ackermann(a,b),5);
  111.            WriteLn; WriteLn;
  112.  
  113.       ELSE WriteString('Falsche Eingabe !! ');
  114.  
  115.     END;  (* CASE *)
  116.     WriteLn; WriteLn;
  117.     WriteString(' Soll noch eine Berechnung vorgenommen werden?  ');
  118.      WriteLn;
  119.     WriteString('[J]a oder [N]ein :  ');
  120.     ReadString(jn);
  121.     WriteLn; WriteLn; WriteLn;
  122.   UNTIL (jn="N") OR (jn="n");
  123. END Function.