2

リストのベキ集合はよく知られています: {1,2,3,4} is {{},{1},{2},{1,2},{3},{1,3},{2,3},{1,2,3},{4},{1,4},{2,4},{1,2,4},{3,4},{1,3,4},{2,3,4},{1,2,3,4}}

その問題に対して私が得た Haskell コードは次のとおりです。

potencia [] = [[]]

potencia (a:bs) = potencia bs ++ map (a:) (potencia bs)

では、同じ長さのサブリストのリストを取得するにはどうすればよいでしょうか?たとえば、上記のリストは、長さ 3 のサブリストの次のリストを生成します ={{1,2,3},{1,2,4},{1,3,4}}

私は学生です。英語で申し訳ありません。よろしくお願いします...XD

4

2 に答える 2

6

どうですか

sublists  _     0 = [[]]
sublists  []    _ = []
sublists (x:xs) n = sublists xs n ++ map (x:) (sublists xs $ n - 1)

これはあなたが持っていたコードに非常に似ていますが、長さとリストの 2 つの減少するパラメーターしかありません。

また、より高度な Haskeller 向け

powerset = flip runCont id . foldM step [[]]
  where step xs x = cont $ \c -> c xs ++ c (map (x:) xs)

継続を使用した再帰のないパワーセット実装です。関数で同じことをするのsublistsは興味深い挑戦です。

于 2013-09-03T01:45:08.773 に答える