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, []).
permute(L) -> zipper(L, []).


% Use zipper to pick up first element of permutation
% Use zipper to pick up first element of permutation
permute([], _) -> [];
zipper([], _) -> [];
permute([H|T], R) ->
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)),
% go further in zipper
% pass zipper state for continuation
++ permute(T, [H|R]).
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>