Вы изначально столкнулись с пределом рекурсии и (в основном) разумно подняли его в ответ.
def quickSort(array, low, high):
if (low<high):
pivot = help(array, low, high)
quickSort(array, low, pivot)
quickSort(array, pivot + 1, high)
Массив, который вы сортируете, содержит 6000 элементов. На первом уровне рекурсии вы вызываете quicksort(array(low, pivot))
, который разбивает ваш массив и вызывает его снова в массиве с около 3000 элементов. Это продолжается до тех пор, пока вы не сортируете массив [0: 2], в стеке около 3000 кадров. Этот последний вызов возвращается, освобождая кадр из стека, а затем происходит второй вызов quicksort(array, pivot + 1, high)
, заполняя его снова.
Если мы до сих пор правильно рассуждали, кажется, что стек увеличивается примерно до 3 тыс. Кадров в глубину, отскакивает туда-сюда (+/- вызывает help()
), прежде чем, наконец, развернуть все обратно когда вы вернете отсортированный массив.
Если это так, то кажется, что практический предел рекурсии, определяемый количеством кадров, которые вы можете поместить в стек, составляет что-то меньше 3000.
Теоретически, любой алгоритм рекурсии может быть решен итеративно, поэтому вы можете попробовать переписать quicksort
. Если вас интересует максимальная глубина рекурсии на вашем компьютере и ОС, вы можете передать целочисленный аргумент, который вы увеличиваете и печатаете при каждом вызове. После того, как он взорвется, наибольшее напечатанное число будет вашим фактическим пределом глубины рекурсии.
setrecursionlimit()
позволяет взять вещи в свои руки со стеком. С великой силой приходит большая ответственность.