Haskell程式交換兩個數字
本教程討論了在Haskell程式語言中編寫交換兩個數字的程式。
Haskell中的變數是不可變的,即一旦宣告,其值就不能更改。因此,我們無法交換兩個變數的值,但可以透過交換列表和元組中的值來模擬此操作。
在本教程中,我們將看到:
- 在二元元組中交換兩個數字的程式。
- 在列表中交換兩個數字的程式。
在Haskell中,元組用於將不同資料型別的元素儲存為集合。元組由兩端的括號標識。元組僅支援少量函式。多個元組不能組合或合併。例如,一個元組看起來像(“john”,24)。
二元元組是隻有兩個元素的元組。
在Haskell中,列表是一種用於儲存相同資料型別元素列表的資料結構。
列表由兩端的方括號標識。列表在Haskell中支援許多函式。多個列表可以組合成一個新列表。例如,一個列表看起來像[1,3,2]是數字列表。
演算法步驟
- 初始化列表或元組。
- 實現程式邏輯以交換列表或元組中的兩個數字。
- 列印結果列表或元組。
示例1
在二元元組中交換兩個數字的程式。
-- function definition swap (a,b) = (b,a) main :: IO() main = do -- declaring and initializing tuple let tup = (21,"john") -- invoking the function swap let revtup = swap tup -- printing the reversed tuple print ("The resultant tuple after the swap is:") print (revtup)
輸出
"The resultant tuple after the swap is:" ("john",21)
在上面的程式中,我們定義了一個名為swap的函式,它接受兩個引數作為元組a,b,並且該函式透過交換其位置返回二元元組。此函式接受二元元組作為引數,並透過交換元素返回一個元組。在主函式中,我們用整數21和字串“john”初始化了一個元組。我們使用此初始化的元組作為引數呼叫了swap函式,並將返回的輸出載入到變數revtup中。最後,使用print函式列印交換後的結果元組。
示例2
在列表中交換兩個數字的程式
swapHelper :: [Int]->Int->Int->[Int] -- function definition swapHelper xs a b = swap xs a b (xs!!a) (xs!!b) -- function declaration swap :: [Int]->Int->Int->Int->Int->[Int] -- function definition swap [] a b e1 e2 = [] swap (x:xs) a b e1 e2 = if(a==0) then [e2] ++ (swap xs (a-1) (b-1) e1 e2) else if (b==0) then [e1] ++ (swap xs (a-1) (b-1) e1 e2) else [x] ++ (swap xs (a-1) (b-1) e1 e2) main :: IO() main = do -- declaring and initializing list indices let list = [1,2,3,4] let a = 0 let b = 1 -- invoking the function swapHelper let revlist = swapHelper list 0 1 -- printing the resultant list print ("The resultant list after swapping elements at indices " ++ show a ++ "," ++ show b ++ " in the list " ++ show list ++ " is:" ) print (revlist)
輸出
"The resultant list after swapping elements at indices 0,1 in the list [1,2,3,4] is:" [2,1,3,4]
在上面的程式中:
我們聲明瞭一個名為swaphelper的函式,它接受整數列表和兩個整數引數,並返回整數列表。在其函式定義中,該函式接受整數列表xs和兩個整數a和b作為引數。swap函式被呼叫,引數為xs、a、b,以及xs中位於整數列表xs索引a和b處的元素。
列表中索引處的元素可以使用中綴函式“!!”檢索。語法為LIST !! INDEX。例如,此程式碼xs!!2返回列表xs中索引2處的元素。
我們聲明瞭一個名為swap的函式,它接受整數列表作為引數,四個整數引數,並返回整數列表。在其函式定義中,它使用模式匹配透過將列表解構為(x:xs)來接受整數列表xs的引數,其中x是列表中的第一個元素,xs是列表的其餘部分。它接受四個整數引數a、b、e1和e2。其中a和b是要替換元素的索引。e1和e2是要替換元素的實際值。
在函式中,檢查a的值,如果a的值為零,則控制權轉移到then塊,其中該函式遞迴呼叫自身,引數為剩餘列表xs、a-1、b-1、e1和e2,並在前面連線單個整數列表[e2]。如果a的值不等於零,則控制權轉移到else塊,其中檢查b的值。
如果b的值為零,則控制權轉移到then塊,其中該函式遞迴呼叫自身,引數為剩餘列表xs、a-1、b-1、e1和e2,並連線單個整數列表[e1]。
如果b的值不等於零,則控制權轉移到else塊,其中該函式遞迴呼叫自身,引數為剩餘列表xs、a-1、b-1、e1和e2,並連線單個整數列表[x]。其中x是列表引數中的第一個元素。
swap函式反轉給定索引處列表中的元素。其中swapHelper是一個輔助函式,用於查詢這些索引處的元素並呼叫swap函式。
在主函式中,整數列表用索引變數a和b初始化。呼叫swap helper函式,並將返回的輸出載入到變數revlist中。最後,使用print函式列印結果列表。
結論
在本教程中,我們討論了在Haskell程式語言中實現一個程式來交換列表和二元元組中的元素。