【问题标题】:adding elements of a list in a given way in haskell [closed]在haskell中以给定方式添加列表元素[关闭]
【发布时间】:2017-10-15 15:10:33
【问题描述】:

有人帮了我下面的函数,但我需要它的逆,这意味着下面的输出将是我的函数的输入,下面的输入将是我的函数的输出

conv = concat . f
where f [] = []
      f (x:xs) = map (x+) xs : f xs

 > conv [3,10,5]
 [13,8,15]

> conv [2,5,15,34]
[7,17,36,20,39,49]

【问题讨论】:

  • 两个反对意见: 1. 问题没有完全说明。你给出一个将三个数字映射到三个数字的关系;相对清楚的是如何将其概括为将 n 个数字映射到 n 个数字,但是您的输入/输出示例之一将 6 个数字映射到 4 个数字。什么? 2. 您没有表现出自己的努力,因此我们无法引导您了解您所犯的具体错误或误解。
  • 这看起来像是某种卷积。我不确定逻辑是什么。在您的第二个示例中,没有明显的方法可以使用给定的关系来解决它。
  • 由于这个帖子已经被搁置,因此不会接受我的回答,这里是它的gist。
  • 我认为这是一个很好的问题,虽然没有很好地表达。

标签: haskell functional-programming


【解决方案1】:

我想你正在寻找这个函数的逆函数

conv = concat . f
    where f [] = []
          f (x:xs) = map (x+) xs : f xs

> conv [3,10,5]
[13,8,15]

> conv [2,5,15,34]
[7,17,36,20,39,49]

我想出了这样的事情。请注意,对于长度小于 3 的情况,不可能有唯一的解决方案,请处理这种情况...

solve x = (reverse . (h :) . map (subtract h) . map head . split') rx
        where rx@(a:b:c:_) = reverse x
              h = (a+b-c) `div` 2

> solve [7,17,36,20,39,49]
[2,5,15,34]

> solve [13,8,15]
[3,10,5]

你可以检查是否

conv . solve = solve . conv = id

split' 在我的屏幕上向上滚动,它被定义为

split' = go 1
     where go _ [] = []
           go n x = take n x : go (n+1) (drop n x)

【讨论】:

  • 是的,先生,我正在搜索该函数的逆函数,请您帮帮我吗?
  • 不错的答案 karakfa,我正在研究我找到的解决方案。它与您的相似,但并不简洁。但是帖子被搁置了,我不能发布它。浪费时间的方式,感谢 StackOverflow
  • split' 定义在哪里?
  • 是的,先生,谢谢你,我找不到 split' 的定义,你在哪里定义的?
  • 先生 karakfa 再次感谢您,但它在 go (n+1) 中给出错误(drop n x)请您一次完整地输入代码
猜你喜欢
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多