首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >反向压缩2列表(不使用zip或反向)

反向压缩2列表(不使用zip或反向)
EN

Stack Overflow用户
提问于 2020-11-01 06:30:56
回答 2查看 115关注 0票数 0

我想要写一个函数,它以两个列表作为参数,并从每个列表中连续地创建一个带有一对的列表,但是相反。例如:

代码语言:javascript
运行
复制
reversezipLists [1, 2, 3] ['a', 'b', 'c']

会产生[('c', 3), ('b', 2), ('a', 1)]

以下是我的尝试:

代码语言:javascript
运行
复制
reversezipLists :: [a] -> [b] -> [(b,a)]
reversezipLists [] [] = []
reversezipLists [] ys = []
reversezipLists xs [] = []
reversezipLists (x:xs) (y:ys) = (y,x) : reversezipLists xs ys

问题是我的代码的输出是:[('a',1),('b',2),('c',3)]。我怎么才能倒过来呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-01 12:26:23

使用累加器:

代码语言:javascript
运行
复制
reversezipLists :: [a] -> [b] -> [(b, a)]
reversezipLists = go [] where
  go acc [] _ = acc
  go acc _ [] = acc
  go acc (h1:t1) (h2:t2) = go ((h2, h1) : acc) t1 t2

加分:函数是尾递归的。基本思想是,在从左到右遍历列表的过程中,我们向acc添加新的对。Haskell列表的堆叠性质使结果发生了逆转。注意,它将截断更长的列表。

如果您想在列表的长度不匹配时抛出错误,则可以使用模式进行一些操作:

代码语言:javascript
运行
复制
reversezipLists :: [a] -> [b] -> [(b, a)]
reversezipLists = go [] where
  go acc [] [] = acc
  go acc (h1:t1) (h2:t2) = go ((h2, h1) : acc) t1 t2
  go _ _ _ = error "lists' sizes don't match" 
票数 1
EN

Stack Overflow用户

发布于 2020-11-01 14:45:01

代码语言:javascript
运行
复制
r (x:xs) (y:ys) = (r xs ys) ++ [(y,x)]
r [] [] = []

R1,2,3= ('c',3),('b',2),('a',1)

它仅适用于长度相同的列表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64629257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档