2012-10-17 47 views
1

我需要返回列表的後綴,似乎無法解決它。使用foldr返回列表的後綴

給出一個列表[1,2,3],函數應該返回[[3],[2,3],[1,2,3]]。我們應該使用foldr和輔助函數來解決。

+1

想想這樣:'foldr'會以相反的順序顯示輸入列表中的每個項目,以及到目前爲止累積的結果。如果你有清單中第一個'n'後綴的列表,並且第n + 1個元素(從最後算起)計算第n + 1個後綴,你需要做什麼? – waldrumpus

回答

0

哈斯克爾是:

suffixes = reverse . foldr f [] where 
    f y [] = [[y]] 
    f y ([email protected](ys:_)) = (y:ys) : yss 

我不知道SML,但解決的辦法應該是相似的

+0

我將你的函數翻譯成SML。希望你不介意。 – pad

+0

謝謝!這的確非常相似(如果我也使用'let'的話,情況會更好)。 – Landei

1

這裏是@ Landei在SML語法的解決方案:

fun suffixes xs = 
    let 
     fun f (y, []) = [[y]] 
     | f (y, yss as (ys::_)) = (y::ys)::yss 
    in 
     rev (foldr f [] xs) 
    end 

我承擔您可以使用SML Basis Libraryrev功能。否則,實現這樣的功能應該很容易。

1

如何:

[1,2,3,4]將返回[1,2,3,4],[2,3,4],[3,4],[4 ]]:

fun myfun1 l = foldr(fn (a,b)=> if a=nil then [] else a::[email protected](tl(l)))[] [l] 

[1,2,3,4]將返回[[4],[3,4],[2,3,4],[1,2,3,4]] :

fun myfun2 l = foldr(fn (a,b)=> if a=nil then [] else myfun2(tl(l))@a::b)[] [l]