递归添加到带有对的列表haskell

i2byvkas  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(131)

我想把我拥有的配对列表添加到一个列表中。例如,如果我有配对:

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

请注意,每一对都是我想要的(值,索引):

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

到目前为止,我已经:

insert :: [(Int,Int)] -> Int -> [Int]
insert []                _ = [] 
insert ((x, y):xs) t
  | t == y = x : (insert (xs) (t + 1))  
  | otherwise = 0     : insert ([(x,y)]) (t + 1)

而我只得到

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

任何帮助都将不胜感激

erhoui1w

erhoui1w1#

这个代码的问题是,当otherwise = 0 : insert ([(x,y)]) (t + 1)完成时,列表的其余部分被丢弃,剩余的xs丢失了。
这里有两个递归:
1.列表中元素的递归
1.递归添加当前元素
所以,我重新编码了它,添加了一个元素:

lst:: [(Int,Int)]
lst = [(2,0),(4,5),(3,10)]

insertOne :: (Int,Int) -> Int -> [Int] -> [Int]
insertOne (x, y) t out
   | t == y = out ++ [x] 
   | otherwise = insertOne (x,y) (t + 1) (out ++ [0])

也要添加所有元素:

insertList :: [(Int, Int)] -> [Int] -> [Int]
 insertList [] target = target
 insertList (x:xs) target =
     insertList xs (insertOne x (length target) target)

如果输入列表是按索引排序的,这似乎是可行的。

insertList lst []  -- [2,0,0,0,0,4,0,0,0,0,3]

相关问题