Advertisement
pseudocreator

Fibonacci (advanced) {5 different ways/procedures}

Mar 23rd, 2014
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. MODULE fibonacci;
  2. FROM InOut IMPORT WriteString, WriteLn, WriteInt, ReadInt, Read;
  3.  
  4. VAR
  5.       proc : PROCEDURE (INTEGER, VAR BOOLEAN): INTEGER;
  6.       result, n : INTEGER;
  7.       ok, again, repeat, ft : BOOLEAN;
  8.       option : CHAR;
  9.  
  10.  
  11.  
  12. PROCEDURE fibonaccislow1(n: INTEGER;VAR ok: BOOLEAN): INTEGER;
  13. CONST
  14.      gr = 35;
  15. VAR
  16.    f: ARRAY[0..2] OF INTEGER;
  17.    i: INTEGER;
  18.  
  19. BEGIN
  20.      IF (0 < n) AND (n < gr) THEN
  21.        ok := TRUE;
  22.        f[0] := 0;
  23.        f[1] := 1;
  24.        f[2] := f[0] + f[1];
  25.        IF n <= 2 THEN
  26.          RETURN f[n]
  27.        ELSE
  28.            i := 2;
  29.            REPEAT
  30.                  f[0] := f[1];
  31.                  f[1] := f[2];
  32.                  ok := MAX(INTEGER) - f[2] > f[1];
  33.                  IF ok THEN
  34.                    f[2] := f[1] + f[0];
  35.                    i := i+ 1
  36.                  END
  37.            UNTIL (i = n) OR NOT ok;
  38.            IF i = n THEN
  39.              ok := TRUE;
  40.              RETURN f[2]
  41.            END
  42.        END
  43.      ELSE ok := FALSE;
  44.      RETURN 0
  45.      END
  46. END fibonaccislow1;
  47.  
  48. PROCEDURE fibonaccislow2(n: INTEGER;VAR ok : BOOLEAN): INTEGER;
  49. VAR
  50.    f0, f1, i : INTEGER;
  51. BEGIN
  52.      IF 0 <= n THEN
  53.        ok := TRUE;
  54.        f0 := 0;
  55.        f1 := 1;
  56.        i := 1;
  57.        WHILE ok AND (i < n) DO
  58.             ok := MAX(INTEGER) - f1 - f1 > f0;
  59.             IF ok THEN
  60.               f0 := f0 + f1;
  61.               f1 := f0 + f1;
  62.               i := i+ 2
  63.             END
  64.        END;
  65.        IF ok THEN
  66.          IF ODD(n) THEN
  67.            RETURN f1
  68.          ELSE
  69.              RETURN f0
  70.          END
  71.        END
  72.      ELSE
  73.          ok := FALSE;
  74.            RETURN 0
  75.      END;
  76. END fibonaccislow2;
  77.  
  78. PROCEDURE fibonaccirecs(n: INTEGER;VAR ok : BOOLEAN): INTEGER;
  79.          PROCEDURE Fib(n: INTEGER): INTEGER;
  80.          BEGIN
  81.               IF n = 1 THEN
  82.                 RETURN n
  83.               ELSE
  84.                 RETURN Fib(n-1) + Fib(n-2)
  85.               END
  86.          END Fib;
  87. BEGIN
  88.      IF n >= 0 THEN
  89.        ok := TRUE;
  90.        RETURN Fib(n)
  91.      ELSE
  92.         ok := FALSE;
  93.         RETURN 0
  94.      END
  95. END fibonaccirecs;
  96.  
  97. PROCEDURE fibonaccirecf(n: INTEGER;VAR ok: BOOLEAN): INTEGER;
  98. CONST
  99.      dg = 0;
  100.      gg = 20;
  101.  
  102.      PROCEDURE Fib(f1,f0,n: INTEGER): INTEGER;
  103.      BEGIN
  104.           IF n = 0 THEN
  105.             RETURN f0
  106.           ELSE
  107.               RETURN Fib(f0+f1,f1,n-1)
  108.           END
  109.      END Fib;
  110.  
  111. BEGIN
  112.      IF (dg <= n) AND (gg >= n) THEN
  113.        ok := TRUE;
  114.        RETURN Fib(1,0,n);
  115.      ELSE
  116.          ok := FALSE;
  117.          RETURN 0
  118.      END
  119. END fibonaccirecf;
  120.  
  121. PROCEDURE fibonacciff(n: INTEGER;VAR ok: BOOLEAN): INTEGER;
  122. VAR
  123.    p1, p2, g1, g2, temp: INTEGER;
  124.    chose: BOOLEAN;
  125. BEGIN
  126.      IF 0 <= n THEN
  127.        ok := TRUE;
  128.        p1 := 0;
  129.        p2 := 1;
  130.        g1 := 1;
  131.        g2 := 2;
  132.        chose := ODD(n);                         (*stack overflow*)
  133.        n := n DIV 2;                            (*check later why!*)
  134.        WHILE n > 0 DO
  135.             IF ODD(n) THEN
  136.               temp := p1*g1;
  137.               p1 := p1*g2 + p2*g1 - temp;
  138.               p2 := p2*g2 + temp
  139.             END;
  140.             n := n DIV 2;
  141.             IF n > 0 THEN
  142.               temp := g1*g1;
  143.               g1 := 2*g1*g2 - temp;
  144.               g2 := g2*g2 + temp
  145.             END
  146.        END;
  147.        IF chose THEN
  148.          RETURN p2
  149.        ELSE
  150.            RETURN p1
  151.        END
  152.      ELSE
  153.          ok := FALSE
  154.      END;
  155.      RETURN 0
  156. END fibonacciff;
  157.  
  158.  
  159.  
  160.  
  161.  
  162. BEGIN
  163.      ft := TRUE;
  164.      REPEAT
  165.            repeat := FALSE;
  166.            WriteString('Enter number, n: ');
  167.            ReadInt(n); WriteLn;
  168.            IF ft THEN
  169.               WriteString('Select procedure, For  '); WriteLn;
  170.               WriteString('iterative, slow.. select 1;');WriteLn;
  171.               WriteString('iterative, fast.. select 2;');WriteLn;
  172.               WriteString('recursive,slow.. select 3;');WriteLn;
  173.               WriteString('recursive,fast.. select 4;');WriteLn;
  174.               WriteString('complex, via the matrix.. select 5;');WriteLn;    (*stackoverflow with this one*)
  175.               WriteString('waiting on input..: ');
  176.               again := FALSE;
  177.               REPEAT
  178.                     Read(option); WriteLn;
  179.                     IF again THEN
  180.                       WriteString('Re-enter your chose, must be (nmb >=1 AND <= 5);');
  181.                     END;
  182.                     again := TRUE;
  183.               UNTIL (option = '1') OR (option = '2') OR (option = '3') OR
  184.               (option = '4') OR (option = '5'); WriteLn;
  185.               CASE option OF
  186.                   '1' : proc := fibonaccislow1|
  187.                   '2' : proc := fibonaccislow2|
  188.                   '3' : proc :=  fibonaccirecs|
  189.                   '4' : proc :=  fibonaccirecf|
  190.                   '5' : proc := fibonacciff
  191.                ELSE
  192.                    WriteString('subtle eR!')
  193.                END;
  194.                ft := FALSE;
  195.            END;
  196.            result := proc(n,ok);
  197.            IF ok THEN
  198.              WriteString('The Resutl is: ');
  199.              WriteInt(result,0);
  200.            ELSE
  201.                WriteString('You have to re-enter number n!');
  202.                repeat := TRUE;
  203.            END;
  204.       UNTIL repeat = FALSE;
  205.  
  206. END fibonacci.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement