В Введение в алгоритмы p169
говорится об использовании хвостовой рекурсии для Quicksort
.
Оригинальный алгоритм Quicksort ранее в этой главе (в псевдокоде)
Quicksort(A, p, r)
{
if (p < r)
{
q: <- Partition(A, p, r)
Quicksort(A, p, q)
Quicksort(A, q+1, r)
}
}
Оптимизированная версия с хвостовой рекурсией выглядит следующим образом
Quicksort(A, p, r)
{
while (p < r)
{
q: <- Partition(A, p, r)
Quicksort(A, p, q)
p: <- q+1
}
}
Где Partition
сортирует массив в соответствии с точкой опоры.
Разница в том, что второй алгоритм вызывает только Quicksort
один раз, чтобы отсортировать LHS.
Может кто-нибудь объяснить мне, почему первый алгоритм может вызвать переполнение стека, тогда как второй не будет? Или я не понимаю книгу.