Permutations: Difference between revisions

→‎{{header|Erlang}}: Made the zipper implementation tail recursive
m (→‎{{header|Perl 6}}: itemize returned array so it doesn't flatten in sequence operator; add works with since niecza doesn't do .= reverse yet)
(→‎{{header|Erlang}}: Made the zipper implementation tail recursive)
Line 1,022:
 
permute([]) -> [[]];
permute(L) -> zipper(L, [], []).
 
% Use zipper to pick up first element of permutation
zipper([], _, Acc) -> []lists:reverse(Acc);
zipper([H|T], R, Acc) ->
% place current member in front of all permutations
% of rest of set - both sides of zipper
prepend(H, permute(lists:reverse(R, T)),
% pass zipper state for continuation
T, [H|R], Acc).
 
prepend(_, [], T, R, Acc) -> zipper(T, R, Acc); % continue in zipper
prepend(X, [H|T], ZT, ZR, Acc) -> [[X|H] | prepend(X, T, ZT, ZR), [[X|H]|Acc]).</lang>
Demonstration (escript):
<lang Erlang>main(_) -> io:fwrite("~p~n", [permute:permute([1,2,3])]).</lang>
Anonymous user