SHORTIES\RECURSIO.MOD  ·  MOD  ·  2.3 KB  ·  1991-06-01  ·  from PCPlus_Issue-57_Jun-1991_FluxEngine-360Kb
MODULE recursion;

FROM InOut IMPORT WriteString, WriteLn, WriteCard;
IMPORT IO;




PROCEDURE nfact (num: CARDINAL): CARDINAL;

BEGIN
  IF num = 1 THEN
    RETURN 1;
  ELSE
    RETURN num * nfact(num-1);
  END;
END nfact;



PROCEDURE iszero (num: CARDINAL): BOOLEAN;

BEGIN
   IF num=0 THEN
     RETURN TRUE
   ELSE
     RETURN FALSE
   END;
END iszero;



PROCEDURE sucessor (num: CARDINAL): CARDINAL;

BEGIN
  RETURN num+1;
END sucessor;



PROCEDURE predecessor (num: CARDINAL): CARDINAL;

BEGIN
  IF num=0 THEN
    RETURN num
  ELSE
    RETURN num-1
  END;
END predecessor;



PROCEDURE sum (x,y: CARDINAL): CARDINAL;

BEGIN
  IF iszero(x)=TRUE THEN
    RETURN y
  ELSE
    RETURN sucessor(sum(predecessor(x),y))
  END;
END sum;



PROCEDURE product (x,y: CARDINAL): CARDINAL;

BEGIN
  IF iszero(y)=TRUE THEN
    RETURN y
  ELSE
    RETURN sum(x,product(x,predecessor(y)))
  END;
END product;



PROCEDURE fib (num: CARDINAL): CARDINAL;

BEGIN
  IF (num=1) OR (num=2) THEN
    RETURN 1
  ELSE
    RETURN fib(num-2) + fib(num-1)
  END;
END fib;



PROCEDURE isodd (num: CARDINAL): BOOLEAN;

BEGIN
  IF iszero(num)=TRUE THEN
    RETURN FALSE
  ELSIF num=1 THEN
    RETURN TRUE
  ELSE
    RETURN isodd(num-2)
  END;
END isodd;



PROCEDURE exponent (x,y: CARDINAL): CARDINAL;

BEGIN
  IF iszero(y)=TRUE THEN
    RETURN 1
  ELSE
    RETURN product(x,exponent(x,predecessor(y)))
  END;
END exponent;



(* Return TRUE  if  x>y else FALSE *)

PROCEDURE greater (x,y: CARDINAL): BOOLEAN;

BEGIN
  IF iszero(x) THEN
    RETURN FALSE
  ELSIF iszero(y) THEN
    RETURN TRUE
  ELSE
    RETURN greater(predecessor(x),predecessor(y))
  END;
END greater;



VAR
  num: CARDINAL;

BEGIN
  WriteString ("Hello World");
  WriteLn; WriteLn; WriteString ("nfact(5)="); WriteCard (nfact(5),4);
  WriteLn; WriteLn; WriteString ("sum(25,8)="); WriteCard (sum(25,8),4);
  WriteLn; WriteLn; WriteString ("product(3,2)="); WriteCard (product(3,2),4);
  WriteLn; WriteLn; WriteString ("fib(6)="); WriteCard (fib(6),4);
  WriteLn; WriteLn; WriteString ("isodd(10)="); IO.WrBool (isodd(10),1);
  WriteLn; WriteLn; WriteString ("exponent(2,3)="); WriteCard (exponent(2,3),4);
  WriteLn; WriteLn; WriteString ("greater(10,8)="); IO.WrBool (greater(10,8),1);

END recursion.