Haskell 程序添加二进制字符串
本教程将讨论编写一个在 Haskell 编程语言中添加二进制字符串的程序。Haskell 中的计算是数学函数。二进制字符串以二进制形式表示一个数字,但使用字符串数据类型。例如:5 描述为“0101”。
算法步骤
将二进制字符串作为输入。
实现添加二进制字符串的逻辑
打印结果二进制字符串。
添加二进制字符串的程序
我们将程序分解成更简单的函数
语法
导入必要的包/模块
import Data.Char
Data.Char 是一个有用的模块,其中包含将字符类型转换为整数和整数类型转换为字符的函数。
添加二进制字符串的函数
-- function declaration for addBString function addBStrings :: [Char]->[Char]->Int->[Char] -- function definitions for addBString function addBStrings [] [] carry = [intToDigit carry] addBStrings (x:xs) [] carry = intToDigit d : addBStrings xs [] newcarry where n1=digitToInt x sum1 = n1 + carry digit = mod sum1 2 carry1 = div sum1 2 d = digit newcarry = carry1 addBStrings [] (x:xs) carry = intToDigit d : addBStrings [] xs newcarry where n1=digitToInt x sum1 = n1 + carry digit = mod sum1 2 carry1 = div sum1 2 d = digit newcarry = carry1 addBStrings (x:xs) (y:ys) carry = intToDigit d : (addBStrings xs ys newcarry) where n1=digitToInt x n2=digitToInt y sum1 = n1 + n2 + carry digit = mod sum1 2 carry1 = div sum1 2 d = digit newcarry = carry1
在上面的函数中,
我们声明了一个名为 addBStrings 的函数,它接受两个字符串(字符数组)和一个整数作为输入,并返回一个字符串。
我们为函数定义了一个基本情况,当字符串为空时,它返回进位作为列表。在这里,我们使用 Data.Char 模块中可用的 intToDigit 函数将整数进位转换为字符,并将其作为列表返回。在 Haskell 中,字符串是字符列表。
在第二个定义中,我们定义了一个第二个输入字符串为空的情况。在这种情况下,首先,我们提取非空字符串中的第一个字符。然后,我们使用 digitToInt 函数将此字符类型转换为整数。我们将整数和进位相加。我们将第一个位置的数字返回以进行连接,并使用剩余字符串和新的进位作为参数递归调用 addBstrings 函数。
第三个定义类似于第二个定义,它处理第一个字符串为空的情况。
第四个定义适用于参数字符串不为空的所有情况,在这里,我们从每个字符串中提取第一个字符,将它们转换为整数并将其添加到进位中。然后,我们将个位上的数字与对相同函数的递归调用(使用剩余字符串和新的进位作为参数)连接起来。
添加二进制字符串的辅助函数 1
-- function declaration helper :: [Char]->[Char]->[Char] -- function definition helper str1 str2 = reverse (addBStrings (reverse str1) (reverse str2) 0)
上面的函数是一个实用函数,用于反转,因为 addBString 函数从左到右添加数字,我们需要反转字符串,然后才能将其传递给该函数。helper 函数将要添加的两个字符串作为输入,反转它们,并将它们传递给 addBString 函数。此函数返回结果字符串的反转以生成正确的输出。
删除前导零的辅助函数 2
-- function declaration helper2 :: [Char]->[Char] -- function definition -- base condition helper2 [x] = [x] helper2 (x:xs) = if x == '0' then helper2 xs else (x:xs)
上面的函数删除 addBString 函数返回的输出字符串中的前导零。此函数接受一个列表/字符串,提取第一个数字,并检查该数字是否为零。如果字符为零,则它将使用剩余字符串递归调用自身,直到结果字符串不包含任何前导零,即如果前导数字不是零,则它将调用基本条件,该条件返回剩余字符串。我们从主函数中调用此函数,并使用 helper 函数 1 的结果来删除学习零。
整体程序
示例
import Data.Char addBStrings :: [Char]->[Char]->Int->[Char] addBStrings [] [] carry = [intToDigit carry] addBStrings (x:xs) [] carry = intToDigit d : addBStrings xs [] newcarry where n1=digitToInt x sum1 = n1 + carry digit = mod sum1 2 carry1 = div sum1 2 d = digit newcarry = carry1 addBStrings [] (x:xs) carry = intToDigit d : addBStrings [] xs newcarry where n1=digitToInt x sum1 = n1 + carry digit = mod sum1 2 carry1 = div sum1 2 d = digit newcarry = carry1 addBStrings (x:xs) (y:ys) carry = intToDigit d : (addBStrings xs ys newcarry) where n1=digitToInt x n2=digitToInt y sum1 = n1 + n2 + carry digit = mod sum1 2 carry1 = div sum1 2 d = digit newcarry = carry1 helper :: [Char]->[Char]->[Char] helper str1 str2 = reverse (addBStrings (reverse str1) (reverse str2) 0) helper2 :: [Char]->[Char] -- base condition helper2 [x] = [x] helper2 (x:xs) = if x == '0' then helper2 xs else (x:xs) main :: IO () main = do let str1="11" let str2="101" print ("First Binary String is: " ++str1) print ("Second Binary String is: " ++str2) print ("Addition of the Binary Strings is: " ++ helper2 (helper str1 str2))
输出
"First Binary String is: 11" "Second Binary String is: 101" "Addition of the Binary Strings is: 1000"
以上是整体程序,在 main 函数中,我们声明并初始化了字符串的变量,并调用了 helper2 函数,其中参数是 helper 函数的函数调用的结果,该函数返回两个字符串相加的结果字符串。现在,此函数接受返回的字符串并删除前导零。最后,我们打印了 helper2 函数返回的字符串。
结论
在本教程中,我们讨论了如何在 Haskell 编程语言中编写一个添加二进制字符串的程序。我们将实现分解成不同的函数以实现逻辑。