Permutations: Difference between revisions
Content added Content deleted
(→{{header|Erlang}}: Add zipper implementation) |
(→{{header|Erlang}}: Get rid of ++ append operation in zipper) |
||
Line 906: | Line 906: | ||
permute([]) -> [[]]; |
permute([]) -> [[]]; |
||
permute(L) -> |
permute(L) -> zipper(L, []). |
||
% Use zipper to pick up first element of permutation |
% Use zipper to pick up first element of permutation |
||
zipper([], _) -> []; |
|||
zipper([H|T], R) -> |
|||
% place current member in front of all permutations |
% place current member in front of all permutations |
||
% of rest of set - both sides of zipper |
% of rest of set - both sides of zipper |
||
prepend(H, permute(lists:reverse(R, T)) |
prepend(H, permute(lists:reverse(R, T)), |
||
% pass zipper state for continuation |
|||
T, [H|R]). |
|||
prepend(_, []) -> |
prepend(_, [], T, R) -> zipper(T, R); % continue in zipper |
||
prepend(X, [H|T]) -> [[X|H] | prepend(X, T)]. |
prepend(X, [H|T], ZT, ZR) -> [[X|H] | prepend(X, T, ZT, ZR)]. |
||
</lang> |
</lang> |
||