【问题标题】:Haskell, taking a list of pairs (value,index) and making it a single list [Int]Haskell,获取对(值,索引)的列表并将其设为单个列表 [Int]
【发布时间】:2022-10-12 18:39:33
【问题描述】:

我是 Haskell 的新手,一直在努力解决这个问题。 我一直在尝试获取一对列表并将其压缩为一个列表

例如,如果我有这些对:

[(2,0),(4,5),(3,10)]

该列表应返回

[2,0,0,0,0,4,0,0,0,0,3]

这个想法是对的第一个元素是值,第二个值是索引。 这是我到目前为止所尝试的:

finalList :: [(Int,Int)] -> [Int]
finalList ((x,y): xs) = replicate y 0 ++ [x] ++ finalList xs
finalList _ = []

但是,对于这个问题,我没有得到我想要的 0 填充。相反,我得到了类似的东西: [6,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,12]

任何帮助将不胜感激!谢谢!

【问题讨论】:

    标签: haskell functional-programming computer-science


    【解决方案1】:

    我会提供一个提示。我还将假设输入列表中的索引是按递增顺序排列的。

    一种可能的方法是首先定义一个辅助函数,该函数需要一个参数,一个“索引”,计算到目前为止我们产生了多少元素。这是您可能使用的部分代码的草图。

    f :: [(Int,Int)] -> Int -> [Int]
    f []                _ = ...  -- base case
    f ((value, pos):xs) ix
      | ix == pos = value : ...  -- here we recurse
      | otherwise = 0     : ...  -- here we recurse too
    

    粗略地说,上面的逻辑是:跟踪当前位置ix:如果该位置是想要的pos,则发出value。否则发出 0 作为填充符。

    在这两种情况下,我们都是递归的,我们需要增加当前位置ix。当前位置is 最初将设置为零,如下所示:

    finalList :: [(Int,Int)] -> [Int]
    finalList xs = f xs 0
    

    请注意,当我们递归时,我们还需要了解如何处理输入列表。我会把它留给你。

    【讨论】:

    • 到目前为止,我已经添加了` f ((value, pos):xs) ix | ix == pos = 值:f (xs) (ix + 1) |否则 = 0 : f ([(value,pos)]) (ix + 1) ` 如果我尝试任何其他实现,我会得到无限循环任何提示? @chi
    • @Wayplace 看起来差不多。在第二种情况下,您应该保持输入列表不变,例如f ((value,pos):xs) (ix+1)。但是,您获得无限递归的事实很奇怪:我的代码假定列表中的位置 pos 正在增加——是吗?如果它们与[(11,5),(12,3),..] 不同,那么您确实会陷入无限的零序列中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多