Выбрать главу

Объявление параметра функции согласно старому стилю состоит из двух частей: списка параметров, заключенного в круглые скобки, который приводится после имени функции, и собственно объявления параметров, которое должно находиться между закрывающей круглой скобкой и открывающей фигурной скобкой функции. Например, это "новое" объявление (т.е. по новому стилю)

float f(int a, int b, char ch)

{ ...

будет выглядеть с использованием старого стиля несколько по-другому.

float f(a, b, ch)

int а, b;

char ch;

{ ...

Обратите внимание на то, что в классической форме после указания имени типа в списке может находиться несколько параметров. В новой форме объявления это не допускается.

В общем случае, чтобы преобразовать объявление параметров из старого стиля в новый (С++-стиль), достаточно внести объявление типов параметров в круглые скобки, следующие за именем функции. При этом помните, что каждый параметр должен быть объявлен отдельно, с собственным спецификатором типа.

Рекурсия

Рекурсивная функцияэто функция, которая вызывает сама себя.

Рекурсия — это последняя тема, которую мы рассмотрим в этой главе. Рекурсия, которую иногда называют циклическим определением, представляет собой процесс определения чего-либо на собственной основе. В области программирования под рекурсией понимается процесс вызова функцией самой себя. Функцию, которая вызывает саму себя, называют рекурсивной.

Классическим примером рекурсии является вычисление факториала числа с помощью функции factr(). Факториал числа N представляет собой произведение всех целых чисел от 1 до N. Например, факториал числа 3 равен 1x2x3, или 6. Рекурсивный способ вычисления факториала числа демонстрируется в следующей программе. Для сравнения сюда же включен и его нерекурсивный (итеративный) эквивалент.

#include <iostream>

using namespace std;

int factr(int n);

int fact(int n);

int main()

{

 // Использование рекурсивной версии.

 cout << "Факториал числа 4 равен " << factr(4);

 cout << '\n';

 // Использование итеративной версии.

 cout << "Факториал числа 4 равен " << fact(4);

 cout << '\n';

 return 0;

}

// Рекурсивная версия.

int factr(int n)

{

 int answer;

 if(n==1) return(1);

 answer = factr(n-1)*n;

 return(answer);

}

// Итеративная версия.

int fact(int n)

{

 int t, answer;

 answer =1;

 for(t=1; t<=n; t++) answer = answer* (t);

 return (answer);

}

Нерекурсивная версия функции fact() довольно проста и не требует расширенных пояснений. В ней используется цикл, в котором организовано перемножение последовательных чисел, начиная с 1 и заканчивая числом, заданным в качестве параметра: на каждой итерации цикла текущее значение управляющей переменной цикла умножается на текущее значение произведения, полученное в результате выполнения предыдущей итерации цикла.

Рекурсивная функция factr() несколько сложнее. Если она вызывается с аргументом, равным 1, то сразу возвращает значение 1. В противном случае она возвращает произведение factr(n-1) * n. Для вычисления этого выражения вызывается метод factr() с аргументом n-1. Этот процесс повторяется до тех пор, пока аргумент не станет равным 1, после чего вызванные ранее методы начнут возвращать значения. Например, при вычислении факториала числа 2 первое обращение к методу factr() приведет ко второму обращению к тому же методу, но с аргументом, равным 1. Второй вызов метода factr() возвратит значение 1, которое будет умножено на 2 (исходное значение параметра n). Возможно, вам будет интересно вставить в функцию factr() инструкции cout, чтобы показать уровень каждого вызова и промежуточные результаты.