使用递归将十进制数转换为二进制的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。然后,从反向顺序获得的余数构造十进制数的二进制表示。递归用于实现这一点。
广告