Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

Глава 14. Управление памятью и b-деревья

Если переменная x быть переданным не определена как справочный параметр, его стоимость скопирована к местной переменной в структуре вызванной функции. Это относится к примитивным типам (таким как интервал и float), указатели (такие как «интервал*»), и даже к классам (таким как «станд.:: вектор <интервал>»). Обратите внимание на то, что, если вызванная функция изменяет ценность этой местной переменной, это не изменит ценность переменной в функции запроса.

С другой стороны, если переменная x передана как справочный параметр, такой как «int&», адрес x передан вместо этого, и этот адрес назначен на некоторую местную переменную y в вызванной функции. Таким образом y и x относятся к тому же самому объекту. Если вызванная функция изменит внутреннее состояние объекта, к которому относится y, то это будет одновременно изменять внутреннее состояние объекта, который x отсылает к (так как они обращаются к тому же самому объекту).

C ++ множества ведут себя несколько по-другому, как бы то ни было. Вспомните из Раздела 1.1.3, что C ++ множество представлен внутренне как указатель на его первый элемент. Таким образом прохождение параметра множества передает копию этого указателя, не копию содержания множества. Начиная с переменной x в функции запроса и связанном местном vari-способном y в вызванной функции разделяют ту же самую копию этого указателя, x [я] и y, который [я] отсылаю к тому же самому объекту в памяти.

Осуществление рекурсии

Одна из выгоды использования стека, чтобы осуществить просьбу функции то, что это

позволяет программам использовать рекурсию. Таким образом, это позволяет функции называть себя как скидка - упрямым в Разделе 3.5. Интересно, ранние языки программирования, такие как КОБОЛ и ФОРТРАН, первоначально не использовали стеки во время выполнения, чтобы осуществить функцию и про - cedure требования. Но из-за элегантности и эффективности, которую позволяет рекурсия, все современные языки программирования, включая современные версии классической LAN - guages как КОБОЛ и ФОРТРАН, используют стек во время выполнения для функции и вызовов процедуры.

В выполнении рекурсивной функции каждая коробка рекурсии прослеживает corre-sponds до структуры стека требования. Кроме того, содержание стека требования соответствует цепи коробок от начальной просьбы функции до текущей.

Чтобы лучше иллюстрировать, как стек во время выполнения допускает рекурсивные функции, давайте рассмотрим C ++ внедрение классического рекурсивного определения факториала tion

n! = n (n- 1) (n- 2) 1

как показано в Кодовом Фрагменте 14.1.

В первый раз, когда мы называем факториал функции, его структура стека включает местную переменную

хранение стоимости n. Факториал функции рекурсивно называет себя, чтобы вычислить (n- 1)!,

который выдвигает новую структуру на стеке требования. В свою очередь, эта рекурсивная просьба

называет себя, чтобы вычислить (n- 2)!, и т.д. Цепь рекурсивных просьб, и таким образом

стек во время выполнения, только растет к размеру n, потому что запрос факториала (1) прибыль