2017-06-13 77 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