Язык С++ и программирование на нем. Рейзлин В.И. - 67 стр.

UptoLike

Составители: 

69
Заметим, что в последнем примере можно обратиться к функции
swap() и с аргументами, отличными по типу от int, и даже с аргумента-
ми, не являющимися объектами:
float a = 5, b = 2.7;
swap (a, b);
swap (3, a+b);
Однако в этих случаях функция swap() фактически никакого
действия со своими аргументами не выполняет. Создаются временные
объекты типа int, которые инициализируются значениями, полученны-
ми в результате преобразования a, b, a+b к типу int; затем ссылки x и
y инициализируются значениями адресов этих анонимных объектов;
анонимные объекты и будут изменены. Фактические параметры же ос-
танутся неизменными.
Компилятор выдаст предупреждение, что он вынужден завести
временные переменные, и будет работать с ними.
16.7. Рекурсивные функции
Ситуацию, когда функция тем или иным образом вызывает саму
себя, называют рекурсией. Рекурсия, когда функция обращается сама к
себе непосредственно, называется прямой; в противном случае она на-
зывается косвенной.
Все функции языка С++ (кроме функции main) могут быть ис-
пользованы для построения рекурсии.
В рекурсивной функции обязательно должно присутствовать хотя
бы одно условие, при выполнении которого последовательность рекур-
сивных вызовов должна быть прекращена.
Обработка вызова рекурсивной функции в принципе ничем не от-
личается от вызова функции обычной: перед вызовом функции в стек
помещаются её аргументы, затем адрес точки возврата, затем, уже при
выполнении функции автоматические переменные, локальные относи-
тельно этой функции. Но если при вызове обычных функций число об-
ращений к ним невелико, то для рекурсивных функций число вызовов и,
следовательно, количество данных, размещаемых в стеке, определяется
глубиной рекурсии. Поэтому при рекурсии может возникнуть ситуация
переполнения стека.
Если попытаться отследить по тексту программы процесс выпол-
нения рекурсивной функции, то мы придем к такой ситуации: войдя в
рекурсивную функцию, мы движемся” по ее тексту до тех пор, пока не