2017-11-02 6 views
1

奇数長のリストのサブリストを印刷したい。私はこれをコード化した。奇数長のリストのサブリストを印刷するhaskellプログラミング

sublists :: [a] -> [[a]] 
sublists [] = [[]] 
sublists (x:xs) = if odd (length (tail xs)) 
        then [x:sublist | sublist <- sublists xs] ++ sublists xs 
        else sublists xs 

例:sublists [1,2,3,4,5,6]

私のように出力を取得しています:私はしたい

[[1,3,5],[1,3],[1,5],[1],[3,5],[3],[5],[]]

[[1,3,5],[2,3,4],[2,3,5],[1],[2,3,6],[3],[5],[2],[4],[6],[1,2,3],[1,2,4],[1,2,5],[1,2,6],[1,3,4],[1,3,6],[1,4,5],[1,4,6],[1,5,6],[2,4,5],[2,4,6],[2,5,6],[3,4,5],[3,4,6],[3,5,6],[4,5,6],[]]

+0

なぜ、長さ5の部分配列が欲しくないのですか? – Redu

+0

'oddSublists = filter oddlengthで始まります。 allSublists'を作成し、 'oddlength :: [a] - > Bool'と' allSublists :: [a] - > [[a]] 'と書く。 – NovaDenizen

答えて

1

は私がするまでsubsequencesを再利用したいと思います私はこれがボトルネックだと確信していました。特にlengthを呼び出すのが快適であると思われるので、効率が大きな問題ではないようです。したがって:

Data.List> filter (odd . length) . subsequences $ [1..4] 
[[1],[2],[3],[1,2,3],[4],[1,2,4],[1,3,4],[2,3,4]] 
関連する問題