(!******************************************************* * Mosel Example Problems * * ====================== * * * * file lcdiv.mos * * `````````````` * * Example for the use of the Mosel language * * (Largest common divisor of two numbers) * * * * (c) 2008 Fair Isaac Corporation * * author: S. Heipcke, 2001 * *******************************************************!) model Lcdiv ! **** Subroutine calling itself recursively public function lcdiv(a,b:integer):integer if(a=b) then returned:=a elif(a>b) then returned:=lcdiv(b,a-b) else returned:=lcdiv(a,b-a) end-if end-function (! This example shows an implementation that uses recursive function calls. With large values for A or B the implementation in function 'lcdiv' can result in quite a large number of levels of recursive calls, which may exceed the system capacity. Instead of using such recursive calls without any predetermined limit on the recursion depth it is generally preferrable to formulate this programming task as a while loop as shown in function 'lcdiv2': !) ! **** Alternative implementation without recursive function calls public function lcdiv2(a,b:integer):integer while (a <> b) do if (a>b) then a:=a-b else b:=b-a end-if end-do returned:=a end-function !******************************************************* declarations A,B: integer ! Two integer numbers end-declarations write("Enter two integer numbers:\n A: ") fflush readln(A) write(" B: ") fflush readln(B) writeln("Largest common divisor: ", lcdiv(A,B)) ! Using the alternative implementation: ! writeln("Largest common divisor: ", lcdiv2(A,B)) end-model