2016-10-02 6 views
3

Это простая рекурсивная функция алгоритма quicksort, и я не нашел оператор return в этой функции, чтобы он не очистил стек после последней рекурсии?Не записывает ли оператор return в функцию void память стека?

void quicksort(int arr[], int p, int r){ 
    int q = partition(arr, p, r); 
    if(p < r){ 
     quicksort(arr,p, q-1); 
     quicksort(arr,q+1, r); 
    } 
} 

Эта функция не возвращает statemnt так будет рекурсивные функции остаются на стеке навсегда, или они будут когда-нибудь опорожнить?

+0

Рекурсия закончится, когда 'p> = r'. –

+0

Существует неявный оператор 'return' непосредственно перед закрытием'} '. В целом полезно помнить, что инструменты (языки, компиляторы), которые делают глупые вещи, быстро умирают. –

+0

это функция 'void', поэтому от нее не ожидается возвратного значения. Кроме того, обычно это код вызывающего абонента, который очищает стек, а не код функции. Наконец, всегда существует неявный 'return;' в конце функции 'void'. –

ответ

4

Рамка стека для функции очищается , когда она в конечном итоге выходит.

Явное заявление return для этого не требуется; когда поток программы встречается с закрывающей скобкой, функция все равно выйдет, а его стек стека будет очищен.

Другой типичный способ, с помощью которого функция может выйти без return (хотя и не в C), путем исключения исключения; снова, стоп-фрейм будет очищен.

+0

Я бы использовал фразу «когда она в конечном итоге возвращает *» вместо «когда она в конечном итоге * выходит» *, чтобы любой будущий читатель не путал оператор 'return' с вызовом' exit'. –

+1

@ AndrewHenle - забавная вещь, я выбрал слово «выходы» вместо «возвращает» специально, чтобы избежать создания какой-либо двусмысленности с помощью оператора 'return'. : D – Jon

+0

@AndrewHenle Я думаю, что нет путаницы, поскольку он ссылается на функцию (* it *), а не на процесс. – m0skit0

1

Как правило, операторы return в void необходимы только в тех случаях, когда вы хотите вернуться до достижения конца тела функции. Заявления последней строки return являются излишними и могут быть проигнорированы. Стек будет очищен с или без return.

0

Эта функция не имеет статута возврата, так что будут рекурсивные функции оставаться на стеке навсегда или они будут опорожнены?

В случае недействительных функций, когда код заканчивается, он заканчивается. Здесь функция void заканчивается, когда p> = r. Рамка стека должна быть удалена, когда она закончится. Последняя закрывающая фигурная скобка '}' в конце кода - это неявный оператор возврата, поэтому возврат не требуется.

Нет необходимости в явном «возврате» в конце для функции void. Однако вы можете использовать «return» в функции void, если он должен выйти раньше на определенное условие до достижения конца функции/кода. Вы также можете использовать «return» в конце функции void, если хотите избежать двусмысленности в отношении того, где функция завершилась как руководство/практика кодирования.

 Смежные вопросы

  • Нет связанных вопросов^_^