fun List.rotateLeft(n: Int) = drop(n) + take(n) fun permute(input: List): List> = when (input.isEmpty()) { true -> listOf(input) else -> { permute(input.drop(1)) .map { it + input.first() } .flatMap { subPerm -> List(subPerm.size) { i -> subPerm.rotateLeft(i) } } } } fun main(args: Array) { permute(listOf(1, 2, 3)).also { println("""There are ${it.size} permutations: |${it.joinToString(separator = "\n")}""".trimMargin()) } }