使用递归将十进制数转换为二进制的Haskell程序


在Haskell中,我们将使用递归和尾递归将十进制数转换为二进制。在第一个例子中,我们将使用基本情况(decToBin 0 = "0" 和 decToBin 1 = "1")和递归情况(decToBin n = decToBin (n `div` 2) ++ show (n `mod` 2))。而在第二个例子中,我们将使用尾递归函数。

算法

  • 步骤1 − 定义用户自定义的decToBin函数,包含基本情况和递归情况,如下所示:

  • 示例1和2 −

decToBin 0 = "0"
decToBin 1 = "1"
decToBin n = decToBin (n `div` 2) ++ show (n `mod` 2).
  • 示例3 −

decToBin n = decToBin' n []
   where
      decToBin' 0 acc = acc
      decToBin' n acc = decToBin' (n `div` 2) (show (n `mod` 2) ++ acc).
  • 步骤2 − 程序执行将从main函数开始。main()函数控制整个程序。它写成main = do。在main函数中,我们定义一个值为15的变量n,并将decToBin n的结果打印到控制台。输出将是十进制数15的二进制表示。

  • 步骤3 − 名为“n”的变量被初始化。它将保存要从十进制数转换为二进制的数字。

  • 步骤4 − 函数调用后,使用‘print’函数将结果的二进制数打印到控制台。

示例1

在这个例子中,我们定义了一个函数decToBin,它接受一个Int参数n并返回其二进制表示形式(字符串)。该函数使用递归将十进制数转换为二进制。

decToBin :: Int -> String
decToBin 0 = "0"
decToBin 1 = "1"
decToBin n = decToBin (n `div` 2) ++ show (n `mod` 2)

main :: IO ()
main = do
   let n = 15
   print (decToBin n)

输出

“1111”

示例2

在这个例子中,结果使用reverse函数反转,因为十进制数的二进制表示是从最低有效位到最高有效位构建的。

decToBin :: Int -> String
decToBin 0 = ""
decToBin n = decToBin (n `div` 2) ++ show (n `mod` 2)

main :: IO ()
main = do
   let n = 15
   print (reverse (decToBin n))

输出

“1111”

示例3

在这个例子中,我们定义了一个尾递归函数decToBin,它接受一个Int参数n并返回其二进制表示形式(字符串)。该函数使用尾递归将十进制数转换为二进制。

decToBin :: Int -> String
decToBin n = decToBin' n []
   where
      decToBin' 0 acc = acc
      decToBin' n acc = decToBin' (n `div` 2) (show (n `mod` 2) ++ acc)

main :: IO ()
main = do
   let n = 15
   print (decToBin n)

输出

“1111”

结论

为了在Haskell中将十进制数转换为二进制,可以编写一个函数,该函数实现重复将十进制数除以2并存储余数的过程,直到十进制数变为0。然后,从反向顺序获得的余数构造十进制数的二进制表示。递归用于实现这一点。

更新于:2023年3月27日

253 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告