nitsujiの日記 RSSフィード

2008-10-28

アナグラム

23:57 | アナグラム - nitsujiの日記 を含むブックマーク はてなブックマーク - アナグラム - nitsujiの日記 アナグラム - nitsujiの日記 のブックマークコメント

プログラミングErlang P44.

code/lib_misc.erl

perms([]) -> [[]];
perms(L)  -> [[H|T] || H <- L, T <- perms(L--[H])].
2> lib_misc:perms("123").
["123","132","213","231","312","321"]

よくわかんないので順を追って考えてみる。

perms("123"). は H|T] || H <- "123", T <- perms("123"--[H])]. で、組み合わせは以下の3通り。

H: "1", T: perms("23")
H: "2", T: perms("13")
H: "3", T: perms("12")

perms("23"). は H|T] || H <- "23", T <- perms("23"--[H])]. で、組み合わせは以下の2通り。

H: "2", T: perms("3")
H: "3", T: perms("2")

perms("3"). は H|T] || H <- "3", T <- ]?. で、これは ["3"] となる。perms("2"). も同様なので perms("23"). は以下のようになる。

["23", "32"]

一つ前に戻って当てはめていく。

H: "1", T: ["23","32"]
H: "2", T: ["13","31"]
H: "3", T: ["12","21"]

なので、

["123","132","213","231","312","321"]

となる。