Еще один красивый пример
Sunday, 10 October 2010 15:26![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Боянистый, правда, до ужаса, но тем не менее красивый.
Взять список чисел на входе. Вернуть на выходе список списков: все перестановки заданных чисел.
Иллюстрирует:
Будучи дословно переведенным на 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 ;)