Haskell程序求两个数的最大公约数
本教程将讨论编写一个在Haskell编程语言中求两个数最小公倍数的程序。Haskell是一种函数式编程语言。
两个数的最大公约数 (GCD) 是能同时整除这两个数的最大整数,也称为最大公因数 (HCF)。
在本教程中,我们将讨论五种实现求两个数最大公约数程序的方法。
使用内置函数gcd。
使用内置函数lcm。
使用列表推导计算GCD。
使用带三个参数的递归函数计算GCD。
使用带两个参数的递归函数计算GCD。
算法步骤
输入两个整数。
实现GCD计算逻辑。
显示输出。
使用内置函数gcd求GCD
示例
使用内置函数gcd求GCD的程序
main :: IO() main = do -- declaring and initializing variables let a = 10 let b = 25 -- print the gcd by invoking the inbuilt function lcm putStr("GCD of "++ (show a) ++ " and "++ (show b) ++" is:") print (gcd a b)
输出
GCD of 10 and 25 is:5
在上面的程序中,我们声明并初始化了值为10和23的变量,我们要计算这两个数的GCD。我们使用了内置函数gcd,它接受两个整数作为参数并返回这两个数的GCD。最后,我们使用print函数打印函数的输出。由于putStr函数只打印字符串类型数据,我们使用show函数将整数转换为字符串。
使用内置函数lcm求GCD
示例
使用内置函数lcm求GCD的程序
main :: IO() main = do let a = 10 let b = 45 -- print the gcd by invoking the inbuilt function gcd putStr("GCD of "++ (show a) ++ " and "++ (show b) ++" is:") print (div (a*b) (lcm a b))
输出
GCD of 10 and 45 is:5
在上面的程序中,我们声明并初始化了要计算GCD的变量。我们使用了内置函数lcm,它接受两个整数作为参数并返回这两个数的LCM。我们知道,一对整数的LCM*GCD等于这对整数的乘积。因此,我们将乘积除以LCM来生成GCD,最后打印计算出的结果。
使用列表推导求GCD
示例
使用列表推导求GCD的程序
-- function declaration gcd3 :: Int->Int->Int -- function definition gcd3 a b = head (reverse [x|x<-[1..b],(mod a x)==0,(mod b x)==0]) main :: IO() main = do let a = 20 let b = 75 -- displaying the output returned from function lcm2 putStr("GCD of "++ (show a) ++ " and "++ (show b) ++" is:") print (gcd3 a b)
输出
GCD of 10 and 25 is:5
在上面的程序中,我们声明了函数gcd3,它接受两个整数作为参数并返回一个整数。在函数定义中,我们接受整数a和b作为参数,并生成从1到b的列表,过滤出同时整除a和b的数。最后,在使用reverse函数反转列表后,我们使用head函数返回列表中的最后一个数。因为列表按升序包含所有同时整除a和b且小于等于a和b的元素,所以最后一个元素将是最大公约数。我们在主函数中调用该函数并打印返回的结果。
注意- Haskell中的函数名应以小写字母开头。在上面的程序中,我们将函数命名为gcd3,因为gcd是gcd函数的内置关键字,所以我们不能使用该关键字。
使用带三个参数的递归函数求GCD
示例
使用带三个参数的递归函数求GCD的程序
-- function declaration gcd4 :: Int->Int->Int->Int -- function definition gcd4 a b c = if ((mod a c)==0&&(mod b c)==0) then c else gcd4 a b (c-1) main :: IO() main = do let a = 10 let b = 25 let c = b -- printing the output by invoking gcd4 function putStr("GCD of "++ (show a) ++ " and "++ (show b) ++" is:") print (gcd4 a b c)
输出
GCD of 10 and 25 is:5
在上面的程序中,我们声明了函数gcd4,它接受三个整数作为输入并返回一个整数。在函数定义中,我们接受三个整数作为参数,其中c的初始值为b。在函数中,我们检查c是否同时整除a和b。如果是,则返回整数c;否则,我们通过将c的值减1来递归调用gcd4函数,即该函数从b开始递归迭代,并返回第一个同时整除a和b的数,即这两个数的最大公约数(GCD)。
使用带两个参数的递归函数求GCD
示例
使用带两个参数的递归函数求GCD的程序
-- function declaration gcd5 :: Int->Int->Int -- function definition gcd5 a 0 = a gcd5 a b = gcd5 b (mod a b) main :: IO() main = do let a = 10 let b = 20 -- printing the output by invoking the gcd5 function putStr("GCD of "++ (show a) ++ " and "++ (show b) ++" is:") print (gcd5 a b)
输出
GCD of 10 and 20 is:10
在上面的程序中,我们声明了一个函数gcd5,它接受两个整数作为参数并返回一个整数。在函数定义中,函数gcd5接受整数a和b作为参数,并对其自身进行递归调用,参数为b和(mod a b),直到基准情况,其中第二个参数变为零,函数返回第一个参数。即此递归函数返回两个参数的GCD。最后,从主函数调用该函数并打印返回的结果。
结论
在本教程中,我们讨论了五种在Haskell编程语言中实现求两个数最大公约数程序的方法,使用了内置函数和自定义函数实现。