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 的结果来删除学习零。

整体程序

示例

Open Compiler
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 编程语言中编写一个添加二进制字符串的程序。我们将实现分解成不同的函数以实现逻辑。

更新于: 2022-10-27

362 次浏览

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告