2017-06-13 76 views
-1

我有列表Int列表,我需要添加一个Int值列表中的最后一个列表。我怎样才能做到这一点?我尝试低于Haskell。列表清单的问题

f :: [[Int]] -> [Int] -> Int -> Int -> Int -> [[Int]] 
f xs [] cur done total = [[]] 
f xs xs2 cur done total = do 
    if total >= length xs2 then 
    xs 
    else 
    if done == fib cur then 
     f (xs ++ [[]]) xs2 (cur + 1) 0 total 
    else 
     f ((last xs) ++ [[xs2!!total]]) xs2 cur (done + 1) (total + 1) 

的问题是: 我们诠释
列表A而且我们需要slpit它N名单B_1 ,..., B_nB_i长度为第i个Fibonacci数。
如果我们(在我的代码xs2)具有列表[1 , 2 , 3 , 4 , 5 , 6 , 7]
结果应该是[[1] , [2] , [3 , 4] , [5 , 6 , 7]]

+0

这我不清楚你的目标是做什么。在这里做什么'cur','done'和'total'? –

+1

@WillemVanOnsem我怀疑大部分代码是写成红鲱鱼。从最后一行看这段代码,'((last xs)++ [[xs2 !! total]])',并将其与所问的问题进行匹配,这似乎很清楚RicUfa的困惑。这似乎有点棘手,解释清楚的错误(并解释清楚如何解决),虽然... –

+0

这是一个问题的附加参数。我需要我需要添加'xs2!总数“到”最后xs“。 – RicUfa

回答

3

处理的问题,如这是问题分成子问题,最简单的方法。在这种情况下,您想要更改列表中的最后一个项目。你想改变它的方式是向它添加一个项目。

首先我们来解决更改列表的最后一项。我们将通过对最后一个项目应用一个函数来做到这一点,而不是对任何其他项目。

onLast :: [a] -> (a -> a) -> [a] 
onLast xs f = go xs 
    where 
    go [] = [] 
    go [x] = [f x] 
    go (x:xs) = x:go xs 

要通过添加额外的价值,你可以用(++ [value])做些什么来改变在列表中的最后一项。

结合使用这两种与您要添加(xs2!!total)的值,我们得到

(onLast xs (++ [xs2!!total])) 
0

你方法使用do块,这是一种奇怪的,因为do块通常用于单子。此外,cur,donetotal正在做什么还不清楚。此外,您使用(!!) :: [a] -> Int -> alength :: [a] -> Int。这些函数的问题在于它们在O(n)中运行,所以它也使代码效率低下。

基于改变规格,要在水桶长度斐波那契数分裂列表。在这种情况下,签名应该是:

f :: [a] -> [[a]] 

因为作为输入你给号码列表,并作为输出,返回号码列表。然后,我们可以实现为:

f :: [a] -> [[a]] 
f = g 0 1 
    where g _ _ [] = [] 
      g a b xs = xa : g b (a+b) xb 
       where (xa,xb) = splitAt b xs 

这产生:

*Main> f [1,2,3,4,5,6] 
[[1],[2],[3,4],[5,6]] 
*Main> f [1,2,3,4,5,6,7] 
[[1],[2],[3,4],[5,6,7]] 
*Main> f [1,2,3,4,5,6,7,8] 
[[1],[2],[3,4],[5,6,7],[8]] 
*Main> f [1,2,3,4,5,6,7,8,9] 
[[1],[2],[3,4],[5,6,7],[8,9]] 

代码的工作原理如下:我们规定f = g 0 1所以我们传递的f的参数g,但g也得到了0和一个1(第一个斐波纳契数)。

每次迭代g检查我们是否到达列表的末尾。如果是这样,我们也会返回一个空列表。否则,我们确定最后一个斐波纳契数(b),并使用splitAt来获取我们处理的列表中的第一个b元素,以及其余部分。然后我们发出第一部分作为列表头,尾部计算下一个斐波纳契数,并将其传递给g,其尾部为splitAt

0
f :: [[Int]] -> Int -> [[Int]]                                                 
f [] _ = []                                                      
f xs i = (take n xs) ++ [[x + i | x <- last xs]]                                             
    where n = (length xs) - 1                                                  
      last = head . (drop n) 

例如,

*Main> f [[1, 2, 3], [], [4, 5, 6]] 5 
[[1,2,3],[],[9,10,11]] 
*Main> f [[1, 2, 3]] 5 
[[6,7,8]] 
*Main> f [] 3