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 次浏览

启动你的职业生涯

通过完成课程获得认证

开始学习
广告