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.