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程式語言中實現求兩個數最大公約數程式的方法,使用了內建函式和自定義函式實現。

更新於:2022年10月27日

1K+ 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.