Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прогр_на_ЯВУ (Cpp)_-_Лекции.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
882.69 Кб
Скачать

6.4 Рекурсия

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

Рассмотрим функцию вычисления факториала целого числа. Ее можно реализовать двумя способами. Первый способ использует итерацию:

int

fact(int n)

{

int result = 1;

for (int i = 1; i <= n; i++)

result = result * i;

return result;

}

Второй способ:

int

fact(int n)

{

if (n == 1) // факториал 1 равен 1

return 1;

else // факториал числа n равен

// факториалу n-1

// умноженному на n

return n * fact(n -1);

}

Функция fact вызывает сама себя с модифицированными аргументами. Такой способ вычислений называется рекурсией. Рекурсия – это очень мощный метод вычислений. Значительная часть математических функций определяется в рекурсивных терминах. В программировании алгоритмы обработки сложных структур данных также часто бывают рекурсивными. Рассмотрим, например, структуру двоичного дерева. Дерево состоит из узлов и направленных связей. С каждым узлом могут быть связаны один или два узла, называемые сыновьями этого узла. Соответственно, для "сыновей" узел, из которого к ним идут связи, называется "отцом". Узел, у которого нет "отца", называется корнем. У дерева есть только один корень. Узлы, у которых нет "сыновей", называются листьями. Пример дерева приведен на рис. 6.1.

Рис. 6.1. Пример дерева.

В этом дереве узел A – корень дерева, узлы B и C – "сыновья" узла A, узлы D и E – "сыновья" узла B, узел F – "сын" узла C. Узлы D, E и F – листья. Узел B является корнем поддерева, состоящего из трех узлов B, D и E. Обход дерева (прохождение по всем его узлам) можно описать таким образом:

  1. Посетить корень дерева.

  2. Обойти поддеревья с корнями — "сыновьями" данного узла, если у узла есть "сыновья".

  3. Если у узла нет "сыновей" — обход закончен.

Очевидно, что реализация такого алгоритма с помощью рекурсии не составляет труда.

Довольно часто рекурсия и итерация взаимозаменяемы (как в примере с факториалом). Выбор между ними может быть обусловлен разными факторами. Чаще рекурсия более наглядна и легче реализуется. Кроме того, в большинстве случаев итерация более эффективна.

Лекция 7 Встроенные типы данных

7.1 Общая информация

Встроенные типы данных предопределены в языке. Это самые простые величины, из которых составляют все производные типы, в том числе и классы. Различные реализации и компиляторы могут определять различные диапазоны значений целых и вещественных чисел.

В Таблице 7.1 перечислены простейшие типы данных, которые определяет язык C++, и приведены наиболее типичные диапазоны их значений.

Таблица 7.1 Встроенные типы языка Си++

Название

Обозначение

Диапазон значений

Байт

char

от -128 до +127

Байт без знака

unsigned char

от 0 до 255

Короткое целое число

short

от -32768 до +32767

Короткое целое число без знака

unsigned short

от 0 до 65535

Целое число

int

от – 2147483648 до + 2147483647

Целое число без знака

unsigned int (или просто unsigned)

от 0 до 4294967295

Длинное целое число

long

от – 2147483648 до + 2147483647

Длинное целое число

unsigned long

от 0 до 4294967295

Вещественное число одинарной точности

float

от ±3.4e-38 до ±3.4e+38 (7 значащих цифр)

Вещественное число двойной точности

double

от ±1.7e-308 до ±1.7e+308 (15 значащих цифр)

Вещественное число увеличенной точности

long double

от ±1.2e-4932 до ±1.2e+4932

Логическое значение

bool

значения true (истина) или false (ложь)