Entry tags:
Еще один красивый пример
Боянистый, правда, до ужаса, но тем не менее красивый.
Взять список чисел на входе. Вернуть на выходе список списков: все перестановки заданных чисел.
Иллюстрирует:
Будучи дословно переведенным на Haskell, иллюстрирует ленивую генерацию списка. На F# для этого потребуется seq, который некрасиво пишется :-)
Работа:
Хорошее упражнение: посчитать сложность работы permute ;)
Взять список чисел на входе. Вернуть на выходе список списков: все перестановки заданных чисел.
Иллюстрирует:
- List comprehensions
- Правую свертку
- Композицию функций
Будучи дословно переведенным на Haskell, иллюстрирует ленивую генерацию списка. На F# для этого потребуется seq, который некрасиво пишется :-)
let permute xs =
let rec insert x = function
| [] -> [[x]]
| y::ys -> (x::y::ys)::[for res in insert x ys -> y::res]
List.foldBack (insert >> List.collect) xs [[]]
Работа:
> permute [1..4];; val it : int list list = [[1; 2; 3; 4]; [2; 1; 3; 4]; [2; 3; 1; 4]; [2; 3; 4; 1]; [1; 3; 2; 4]; [3; 1; 2; 4]; [3; 2; 1; 4]; [3; 2; 4; 1]; [1; 3; 4; 2]; [3; 1; 4; 2]; [3; 4; 1; 2]; [3; 4; 2; 1]; [1; 2; 4; 3]; [2; 1; 4; 3]; [2; 4; 1; 3]; [2; 4; 3; 1]; [1; 4; 2; 3]; [4; 1; 2; 3]; [4; 2; 1; 3]; [4; 2; 3; 1]; [1; 4; 3; 2]; [4; 1; 3; 2]; [4; 3; 1; 2]; [4; 3; 2; 1]]
Хорошее упражнение: посчитать сложность работы permute ;)
no subject
:- module perm.
:- interface.
:- import_module io.
:- pred main(io, io).
:- mode main(di, uo) is det.
:- implementation.
:- import_module list, solutions.
appendl([]) = [].
appendl([H]) = H.
appendl([H1,H2|T]) = appendl([append(H1, H2)|T]).
:- mode permut(in, out) is multi.
permut([], []).
permut([H | T], appendl([A, [H], B])) :-
permut(T, Pt),
append(A, B, Pt).
main -->
{ solutions(permut(1..5), Perms) },
print(Perms).
результат
>perm
[[1, 2, 3, 4], [1, 2, 4, 3], [1, 3, 2, 4], [1, 3, 4, 2], [1, 4, 2, 3], [1, 4, 3,
2], [2, 1, 3, 4], [2, 1, 4, 3], [2, 3, 1, 4], [2, 3, 4, 1], [2, 4, 1, 3], [2, 4
, 3, 1], [3, 1, 2, 4], [3, 1, 4, 2], [3, 2, 1, 4], [3, 2, 4, 1], [3, 4, 1, 2], [
3, 4, 2, 1], [4, 1, 2, 3], [4, 1, 3, 2], [4, 2, 1, 3], [4, 2, 3, 1], [4, 3, 1, 2
], [4, 3, 2, 1]]