Haskell程序:十进制转换为二进制
在 Haskell 中,我们将使用 reverse 函数、尾递归和 divMod 函数将十进制转换为二进制。在第一个示例中,我们将使用 (decToBin n | n < 0 = error "Input must be non-negative" | n == 0 = "0" | otherwise = reverse $ decToBin' n) 函数,在第二个示例中,我们将使用 (binDigits 0 = "" and binDigits n = let (q, r) = n `divMod` 2 in show r ++ binDigits q) 函数。
方法 1:使用 reverse 函数和尾递归
在这种方法中,decToBin 函数接受一个整数 n 作为输入,并返回 n 的二进制表示形式(字符串)。该函数首先检查输入 n 是否是非负数。如果 n 为负数,则引发错误。如果 n 为零,则返回字符串“0”。否则,它将调用带有 n 的 decToBin' 辅助函数,然后反转结果字符串。
算法
步骤 1 − 导入 Data.Char 库。
步骤 2 − 使用 reverse 函数定义 decToBin 函数,如下所示:
decToBin n | n < 0 = error "Input must be non-negative" | n == 0 = "0" | otherwise = reverse $ decToBin' n. The helper decToBin’ function is defined as, decToBin' n | n == 0 = "" | otherwise = show (n `mod` 2) ++ decToBin' (n `div` 2).
步骤 3 − 程序执行将从 main 函数开始。main() 函数控制整个程序。它被写成 main = do。在 main 函数中,decToBin 函数被调用并带有一个参数,结果被打印到控制台。
步骤 4 − 初始化名为“n”的变量。它将保存要转换为相应二进制数的十进制数。
步骤 5 − 函数调用后,使用‘putStrLn’语句将结果二进制数打印到控制台。
示例 1
在这个示例中,使用 reverse 函数定义了尾递归函数来将十进制数转换为二进制数。
decToBin :: Integer -> String decToBin n | n < 0 = error "Input must be non-negative" | n == 0 = "0" | otherwise = reverse $ decToBin' n decToBin' :: Integer -> String decToBin' n | n == 0 = "" | otherwise = show (n `mod` 2) ++ decToBin' (n `div` 2) main :: IO () main = do let n = 15 putStrLn $ "The binary representation of " ++ show n ++ " is " ++ decToBin n
输出
The binary representation of 15 is 1111
方法 2:使用 divMod 函数
在这种方法中,使用辅助函数 binDigits 递归生成输入数字的二进制数字。binDigits 函数接受输入数字 n 并返回 n 的二进制数字(字符串)。这些数字是通过重复将 n 除以 2 并取余数生成的。结果以相反的顺序累积为字符串,使用 show r 将余数转换为字符串。
算法
步骤 1 − 使用 reverse 函数定义 decToBin 函数,如下所示:
decToBin n | n < 0 = error "Input must be non-negative" | n == 0 = "0" | otherwise = reverse $ binDigits n. The recursive binDigits function is defined using divMod function as, binDigits 0 = "" binDigits n = let (q, r) = n `divMod` 2 in show r ++ binDigits q.
步骤 2 − 程序执行将从 main 函数开始。main() 函数控制整个程序。它被写成 main = do。在 main 函数中,decToBin 函数被调用并带有一个参数,结果被打印到控制台。
步骤 3 − 初始化名为“n”的变量。它将保存要转换为相应二进制数的十进制数。
步骤 4 − 函数调用后,使用‘putStrLn’语句将结果二进制数打印到控制台。
示例 1
在这个示例中,使用 divMod 函数定义了递归函数来将十进制数转换为二进制数。
decToBin :: Integer -> String decToBin n | n < 0 = error "Input must be non-negative" | n == 0 = "0" | otherwise = reverse $ binDigits n binDigits :: Integer -> String binDigits 0 = "" binDigits n = let (q, r) = n `divMod` 2 in show r ++ binDigits q main :: IO () main = do let n = 15 putStrLn $ "The binary representation of " ++ show n ++ " is " ++ decToBin n
输出
The binary representation of 52 is 1111
结论
在 Haskell 中,十进制数转换为二进制数可以使用 reverse 函数结合尾递归,或者使用 divMod 函数。将十进制数转换为二进制数的过程涉及重复将十进制数除以 2 并取余数。然后以相反的顺序读取余数,以获得十进制数的二进制等效值。