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