Существует гораздо менее сложный способ вычисления этого. На самом деле написать программу может быть не так просто, но она позволяет вам выработать ответ вручную. :) (Подсказка: сколько существует перестановок? Сколько из них начинается с 0?)
Кроме того, range(len(x))
крайне непифоничен. Конечно, было бы неплохо иметь индексы, чтобы разрезать список, чтобы удалить «текущий» элемент ... но есть и другой способ: просто попросите Python удалить элементы с этим значением (поскольку существует только один такой элемент ). Это позволяет нам зацикливать значения элементов напрямую:
for digit in digits:
state.append(digit)
rest = digits[:]
rest.remove(digit) # a copy with the current value removed.
getLexicographicPermutationsOf(rest, state)
state.pop()
range
в первую очередь полезен для фактического создания диапазонов данных, например, при инициализации digits
с помощью. :)
Я что-то здесь упускаю?
Вам не хватает того, что простой рекурсивный вызов функции никуда не волшебно поместит ее результаты. На самом деле, даже если вы «дадите» результаты рекурсивного вызова, он все равно не будет делать то, что вы хотите - вы получите генератор, который возвращает генераторы (которые возвращают генераторы и т. Д.) Вплоть до база рекурсии), когда вы хотите один генератор. (Ответ FogleBird объясняет, как с этим справиться: вы должны взять генератор из рекурсивного вызова и явно «подать» его полученные элементы в текущий генератор.)
Но в любом случае есть гораздо более простой способ: в библиотеку уже встроен этот алгоритм.
Вся программа может быть выполнена таким образом:
from itertools import permutations, islice
print next(islice(permutations(range(10)), 1000000, None))
почему он печатается как список (в квадратных скобках, разделенных запятыми)?
Потому что строка содержит квадратные скобки и запятые. Это то, что вы получаете, когда используете str
в списке (state
, в данном случае).