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 并取余数。然后以相反的顺序读取余数,以获得十进制数的二进制等效值。

更新于: 2023年3月13日

740 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告