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 程式語言中編寫一個新增二進位制字串的程式。我們將實現分解成不同的函式以實現邏輯。

更新於: 2022-10-27

362 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告