Не имеет отношения к этому, но вам может быть интересно узнать, что вы можете вычислить миллионную лексикографическую перестановку, не вычисляя ни одну из предыдущих.
Идея довольно проста: для N
цифр есть N!
перестановок.Это означает, что 10 цифр могут дать 3628800 перестановок, 9 цифр могут дать 362880 перестановок и так далее.Учитывая эту информацию, мы можем вычислить следующую таблицу:
First digit First Permutation Last Permutatation
0 1 362880
1 362881 725760
2 725761 1088640
3 1088641 1451520
4 1451521 1814400
5 1814401 2177280
6 2177281 2540160
7 2540161 2903040
8 2903041 3265920
9 3265921 3628800
Таким образом, первая цифра будет 2, потому что это диапазон, в котором находится 1000000.Или, проще говоря, первая цифра - это цифра в индексе (1000000 - 1) / fat(9)
.Так что вам просто нужно применить это рекурсивно:
def fat(n: Int) = (2 to n).foldLeft(1)(_*_)
def permN(digits: String, n: Int): String = if (digits.isEmpty) "" else {
val permsPerDigit = fat(digits.length - 1)
val index = (n - 1) / permsPerDigit
val firstDigit = digits(index)
val remainder = digits filterNot (firstDigit ==)
firstDigit + permN(remainder, n - index * permsPerDigit)
}