import java.util.LinkedList inline fun combinations(arr: Array, m: Int) = sequence { val n = arr.size val result = Array(m) { arr[0] } val stack = LinkedList() stack.push(0) while (stack.isNotEmpty()) { var resIndex = stack.size - 1; var arrIndex = stack.pop() while (arrIndex < n) { result[resIndex++] = arr[arrIndex++] stack.push(arrIndex) if (resIndex == m) { yield(result.toList()) break } } } } fun main() { val n = 5 val m = 3 combinations((1..n).toList().toTypedArray(), m).forEach { println(it.joinToString(separator = " ")) } }