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程式語言中實現一個程式來交換列表和二元元組中的元素。

更新於:2022年12月14日

840 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告