home *** CD-ROM | disk | FTP | other *** search
- 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.