Haskell程式:十進位制轉換為八進位制
我們可以使用Haskell的遞迴和unfoldr函式將十進位制數轉換為八進位制數。
十進位制到八進位制的轉換是將十進位制(基數為10)數轉換為其在八進位制(基數為8)數制中的等效表示的過程。
在十進位制數制中,我們使用10個數字(0到9)來表示一個數。在八進位制數制中,我們使用8個數字(0到7)來表示一個數。為了將十進位制數轉換為其等效的八進位制表示,我們反覆將十進位制數除以8,直到商變為0,並記錄餘數。從下往上讀取的餘數就給出了十進位制數的八進位制表示。
演算法
步驟1 − 使用內部函式定義decimalToOctal函式
步驟2 − 程式執行將從main函式開始。main()函式控制整個程式的執行。它寫成main = do。在main函式中,decimalToOctal函式被呼叫,引數為42,結果被列印到控制檯。
步驟3 − 函式呼叫後,使用‘putStrLn’語句將生成的八進位制數列印到控制檯。
示例1
在這個例子中,使用了兩個輔助函式decimalToOctal和decimalToOctalHelper來執行轉換。decimalToOctal函式使用尾遞迴方法,結果在一個字串acc中累積,該字串作為引數傳遞給decimalToOctalHelper函式。decimalToOctalHelper函式反覆將十進位制數除以8,直到它變為0,這些除法的餘數連線起來形成八進位制表示。
module Main where decimalToOctal :: Int -> String decimalToOctal 0 = "0" decimalToOctal n = decimalToOctalHelper n [] decimalToOctalHelper :: Int -> String -> String decimalToOctalHelper 0 acc = acc decimalToOctalHelper n acc = decimalToOctalHelper (n `div` 8) (show (n `mod` 8) ++ acc) main :: IO () main = putStrLn (decimalToOctal 42)
輸出
52
示例2
在這個例子中,定義了一個函式decimalToOctal,它接收一個整數x作為輸入,並將其等效的八進位制表示作為字串返回。main函式將decimal設定為42,然後將其傳遞給decimalToOctal函式以獲取八進位制表示。最後,使用putStrLn將結果列印到螢幕上。
import Data.List (unfoldr) decimalToOctal :: Int -> String decimalToOctal x = concat $ reverse $ unfoldr step x where step 0 = Nothing step y = Just (show (y `mod` 8), y `div` 8) main :: IO () main = do let decimal = 42 putStrLn $ "The equivalent octal representation is: " ++ decimalToOctal decimal
輸出
The equivalent octal representation is: 52
示例3
在這個例子中,使用遞迴將十進位制數轉換為其等效的八進位制表示。當x為0時為基例,在這種情況下,結果只是字串"0"。對於x的任何其他值,該函式首先呼叫自身並將x除以8以獲得商的八進位制表示,然後附加x除以8的餘數,這是八進位制表示當前最低有效位。
decimalToOctal :: Int -> String decimalToOctal 0 = "0" decimalToOctal x = decimalToOctal (x `div` 8) ++ show (x `mod` 8) main :: IO () main = do let decimal = 42 putStrLn $ "The equivalent octal representation is: " ++ decimalToOctal decimal
輸出
The equivalent octal representation is: 052
結論
在Haskell中,可以使用unfoldr函式或使用遞迴或尾遞迴將十進位制數轉換為八進位制數。