Подпрограммы: процедуры.




И-22, II семестр

Литература. 1. В. Б. Попов. Turbo Pascal для школьников.

2. В. П. Леонтьев. Новейшая энциклопедия ПК 2003 г. «ОЛМА ПРЕСС», 2003 г.

3. О. Ефимов, В Морозов, Ю. Шафрин. Курс компьютерной технологии (уч. пособие для старших классов). «Финансы и статистика», 2002 г.

Модуль Graph

Генерация звука в модуле Crt

1. Общие сведения. Для создания звуковых эффектов в Паскале используются стандартные процедуры Sound, NoSound и Delay модуля Crt.

Sound(I:word) – активизирует звуковые средства персонального компьютера. Целочисленное значение I указывает частоту звучания звука в герцах. Звук указанной частоты будет генерироваться до тех пор, пока на будет отменен процедурой NoSound.

NoSound - отмена звука. Отменяет звуковой режим, заданный процедурой Sound.

Для указания времени, в течение которого будет продолжаться звучание, используется процедура Delay.

Пример. Звуковой сигнал с частотой 500 Гц будет звучать в течение 2 с (2000 мс).

Program Primer;

Uses Crt;

Begin

Sound(500);

Delay(2000);

NoSound;

End.

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

Для создания разнообразных звуковых эффектов используется набор частот или элементы массива, соответствующие нотам различных октав (см. табл.).

Нота Большая октава Малая октава Первая октава Вторая октава
До 130,81 261,63 523,25 1046,50
Ре 146,83 293,66 587,33 1174,07
Ми 164,81 329,63 659,26 1318,05
Фа 174,61 349,23 698,46 1396,09
Соль 196,00 392,00 784,99 1568,00
Ля 220,00 440,00 880,00 1760,00
Си 246,94 493,88 987,77 1975,00

Для использования в процедуре Sound все указанные в таблице значения частот округляются.

2. Генерация мелодий. Одним из способов построения мелодичных звуковых рядов является использование частот, соответствующих нотам. Частоты загружаются в один массив, продолжительность звучания каждой ноты – в соответствующие элементы другого массива.

Пример

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

Program Gamma; {заголовок программы}

Uses Crt; {подключение модуля Crt}

Const {объявление констант – массивов}

M: Array[1..7] of Integer = (262, 294, 330, 349, 392, 440, 494); {массив нот}

T: Array[1..7] of Integer = (100, 110, 120, 130, 140, 150, 160); {массив длительностей}

Var i:Integer; {объявление переменной}

Begin

While not KeyPressed {пока не нажата любая клавиша,}

Do Begin

For i:=1 to 7 {воспроизводим гамму из семи нот,}

Do Begin {каждая из которых имеет свою}

Sound(M[i]); {длительность}

Delay(T[i]);

NoSound;

End;

End;

End. {конец программы}

Меняя значения элементов массивов М и Т, можно добиться довольно хорошей имитации музыкальных произведений.

Пример

Воспроизведение музыкальной гаммы с полутонами на 4 октавы.

Program Gamma;

Uses Crt;

Const {объявление констат}

F:array[1..12] of Real = (130.8, 138.6, 146.8, 155.6, 164.8, 174.6, 185.0, 196.0, 207.7, 220.0, 233.1, 246.9); {массив полутонов для одной октавы}

Temp = 150; {длительность каждой ноты}

Var

i, j: Integer; {объявление переменных – параметров циклов}

Begin {вывод гаммы с нарастающей частотой}

For i:=0 to 3 {i – счетчик октав}

Do For j:=1 to 12 {j – счетчик нот-полутонов}

Do Begin {при переходе от одной октавы к соседней}

Sound(Round(F(j)*(1 shl i))); {частоты изменяются в два раза,}

Delay(Temp); {поэтому исходные частоты самой низкой}

NoSound; {октавы надо умножать на 2 j, а степени}

End; {числа 2 получаются сдвигом 1 влево на j разрядов}

For i:=3 downto 0 {вывод гаммы с убывающей частотой звука}

Do For j:=12 downto 1

Do Begin

Sound(Round(F(j)*(1 shl i)));

Delay(Temp);

NoSound;

End;

End.

Пример

Требуется вывести в центр экрана элемент заставки «Добрый день!» в сопровождении звукового сигнала.

Program ZvukOut; Uses Crt; Var St: string[40]; I: Byte; Begin Clrscr; St:=’Д О Б Р ЫЙ Д Е Н Ь!!!’; GotoXY(18,12); For I:=1 to Length(St) Do Begin Write(St[I]); Sound(5000); Delay(70); NoSound; End; End. {заголовок программы} {подключение модуля Crt} {объявление переменных – строки вывода и} {параметра цикла} {очистка экрана} {вывод сообщения “Добрый день!”} {вывод каждого символа строки} {сопровождается звуковым сигналом} {конец программы}

Подпрограммы: процедуры.

1. Структурное программирование и технология нисходящего программирования.

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

С другой стороны, увеличение продолжительности жизненного цикла программ приводит к тому, что со временем из-за изменения условий использования программ возникает необходимость их модификации и повышения их эффективности.

Для разрешения этих проблем в практике программирования выработан рад приемов и методов, которые принято называть методами структурного программирования. Под структурным программированием понимают методы разработки и записи программы, ориентированные на максимально удобное восприятие и понимания ее человеком. Структурное программирование – это программирование, при котором операторы перехода не используются без особой надобности. В связи с этим программы представляет собой последовательность логических структур (следование, ветвление, повторение), которые определяют порядок выполнения содержащихся в них правил обработки данных.

Т. к. программа задает правила обработки данных, то определение самих данных (их количества, имен, типов и т. д.) при написании программы имеет не менее важное значение, чем задание правил их обработки. Таким образом, чем четче определены сами данные, тем легче разрабатывать правила их обработки. Простота и надежность программы существенно зависят от того, насколько удобно отдельные обрабатываемые данные объединены в некоторые структуры.

С массовым внедрением вычислительной техники процесс программирования постепенно превращается в промышленное изготовление программ. Для этого создаются различные технологии, одна из них технология нисходящего программирования. Эта технология базируется на методе программирования «сверху – вниз». Основой этого метода является то, что любую сложную задачу можно разбить на более простые подзадачи, или фрагменты. Решение отдельного фрагмента сложной задачи может представлять собой самостоятельный программный блок. Процесс детализации продолжается до тех пор, пока на станут ясны все детали решения задачи. В этом случае программу решения сложной задачи можно представить как иерархическую совокупность относительно самостоятельных фрагментов - подпрограмм. Таким образом, подпрограммой называется обособленная, оформленная в виде отдельной синтаксической конструкции и снабженная именем часть программы. Использование подпрограмм позволяет выполнять одну и туже обработку различных данных в разных участках основной программы, что существенно уменьшает объем программы и упрощает ее написание. Например, формирование случайным образом и вывод на экран одномерных массивов разной размерности (см. задачу 1).

Понятие подпрограммы как обособленной именованной части программы со своими собственными объектами (переменными, константами и т. д.) является основным средством структурирования программ во многих языках программирования.

2. Подпрограммы в языке Pascal. Понятие «процедура».

Все подпрограммы языка Pascal делятся на стандартные (входят в состав языка и вызываются для выполнения по строго фиксированному имени) и определенные пользователем (разрабатываются и именуются самим пользователем). К стандартным относятся, например, подпрограммы модулей Graph и Crt. Далее мы будем рассматривать подпрограммы, определенные пользователем.

В Pascal существует 2 вида подпрограмм: процедуры и функции. Имея один и тот же смысл и аналогичную структуру, процедуры и функции различаются назначением и способом их использования. Функции представляют собой частный случай процедур и будут рассмотрены позже.

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

2. Структура программы.

Program Primer; {заголовок основной программы }

Uses …; {раздел подключения модулей основной программы }

Label …; {раздел описания меток основной программы }

Const …; {раздел описания констант основной программы }

Type …; {раздел описания типов основной программы }

Var …; {раздел описания переменных основной программы }

Procedure <имя_процедуры> (<список формальных параметров>); {заголовок процедуры }

Раздел описаний п/п
Label …; {раздел описания меток процедуры }

Const …; {раздел описания констант процедуры }

Тело п/п
Type …; {раздел описания типов процедуры }

Раздел операторов п/п
Var …; {раздел описания переменных процедуры }

Begin {начало процедуры }

… { тело процедуры }

End; {конец процедуры }

Begin {начало основной программы }

<имя_процедуры>(<список фактических параметров>); {вызов процедуры}

End. {конец основной программы }

В отличие от основной программы, в конце подпрограммы (при описании) обязательно ставится точка с запятой, а не точка (основное отличие). <Имя_процедуры> - это идентификатор, уникальный в пределах программы. Упоминание имени процедуры в тексте программы называется вызовом процедуры.

3. Формальные и фактические параметры.

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

Формальные параметры называются так, потому что в <списке формальных параметров> заданы только имена для обозначения исходных данных и результатов работы процедуры. Имя формального параметра отделяется от типа параметра двоеточием, а параметры друг от друга – точкой с запятой. Имена параметров одного типа можно перечислять через запятую, а затем через двоеточие указывать их тип. Внутри подпрограммы все действия производятся с формальными параметрами.

При вызове подпрограммы на место формальных параметров подставляются конкретные значения (выражения) либо имена конкретных переменных. Это <список фактических параметров>. Имена фактических и формальных параметров не должны совпадать.

Между формальными и фактическими параметрами должно быть полное соответствие:

- формальных и фактических параметров должно быть одинаковое количество;

- порядок следования фактических и формальных параметров должен быть один и тот же;

- тип каждого фактического параметра должен совпадать с типом соответствующего формального параметра.

Если параметром подпрограммы является массив (одномерный или двумерный), то следует описать тип-массив в разделе описания типов основной программы (см. задачу 1).

4. Параметры-значения и параметры-переменные (входные и выходные параметры) подпрограмм, механизм передачи параметров (можно перенести на Занятие 2, если не хватит времени).

Формальные параметры подпрограмм можно разбить на две основные группы: параметры-значения (без Var) и параметры-переменные (c Var).

Параметры-значения используются только для передачи исходных данных из основной программы в подпрограмму, поэтому они являются входными параметрами. Параметры-значения могут изменяться подпрограммой, но в основную программу они не передаются.

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

Параметры-переменные обязательно используются для определения результатов выполнения процедуры, поэтому они являются выходными параметрами. После окончания работы процедуры они передаются в основную программу. В <списке формальных параметров> выходные параметры перечисляются после зарезервированного слова Var с обязательным указанием типа.

Входные параметры = параметры-значения (без Var). Выходные параметры = параметры-переменные (с Var).

 

Каждому формальному параметру, объявленному как параметр-переменная, должен соответствовать фактический параметр в виде переменной соответствующего типа. Если формальный параметр определен как параметр-переменная, то при вызове процедуры ей передается сама переменная, а не её копия (подпрограмме разрешается доступ к области памяти, где хранится значение переменной), и изменение параметра-переменной приводит к изменению фактического параметра в вызывающей программе. Следовательно, исходные данные в процедуру из программы могут передаваться как через параметры-значения, так и через параметры-переменные, а результаты работы процедуры возвращаются в вызывающую программу только через параметры-переменные.

Например, (задача 1) в процедуре формирования массива Input() параметр D типа Massiv является выходным (параметром-переменной), т. к. процедура формирует матрицу, т. е. изменяет переменную. А целочисленное N процедурой не изменяется, поэтому является параметром-значением.

5. Локальные и глобальные переменные, область действия переменных

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

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

Если одно и то же имя определено и в программе, и в вызываемой ею процедуре, то ему соответствует глобальный объект, но внутри процедуры глобальный объект недоступен, он как бы экранируется (маскируется) локальным объектом с таким же именем.

Например, (см. задачу 1) массивы А и В являются глобальными переменными, а i – локальной переменной.

В Pascal допускается любой уровень вложенности подпрограмм. Процедура, описанная в основной программ, в свою очередь. Может иметь описания внутренних процедур и функций и т. д. При этом объекты, описанные в вызывающей процедуре, являются глобальными по отношению к вызываемой процедуре. Если схематично изобразить некоторую программу,

 
 

 

 


то можно сформулировать следующие правила для доступа к объектам, описанным в различных блоках:

- имена объектов, описанных в некотором блоке, считаются известными в пределах данного блока, включая и все вложенные (например, вложенными являются блоки C и D по отношению к блоку В);

- имена объектов, описанных в блоке, должны быть уникальны в пределах данного блока и могут совпадать с именами объектов из других блоков;

- если в некотором блоке описан объект, имя которого совпадает с именем объекта, описанного во внешнем блоке (например, для блока F внешним является блок Е), то имя объекта внешнего блока становится недоступным в данном блоке (оно как бы экранируется одноименным объектом данного блока).

Например, (см. рис.) можно сказать, что объекты, описанные в блоке В, известны (видимы) кроме самого блока В еще и в блоках С и D, но невидимы в блоке А. Объекты, описанные в блоке F, известны только в пределах этого блока.

Задача 2. С помощью датчика случайных чисел сформировать матрицы А{5,6} и В{7,5}. Вывести их на экран. Использовать процедуры. Для каждой матрицы сформировать одномерный массив из сумм элементов каждой строки.

а) Схема алгоритма основной программы:

б) Схема алгоритма процедуры формирования матрицы:

 

 

в) Схема алгоритма процедуры вывода матрицы:

г) Схема алгоритма процедуры вывода массива:

 

 

д) Схема алгоритма процедуры формирования массива из матрицы:

 

Program Primer; Uses Crt; Type Matrica=array[1..7,1..6] of Integer; Massiv=array[1..7] of Integer; Var A, B: Matrica; E, F: Massiv; Procedure Input(Var D:Matrica; N,K:Integer); Var i, j: Integer; Begin Randomize; For i:=1 to N Do For j:=1 to K Do D[i,j]:=Random(10)-5; End; Procedure Output(D:Matrica; N,K:Integer); Var i, j: Integer; Begin For i:=1 to N Do Begin For j:=1 to K Do Write(D[i,j]:4,’ ‘); Writeln; End; End; Procedure Output_Massiv(Z:Massiv; N:Integer); Var i: Integer; Begin For i:=1 to N Do Writeln(Z[i]:4); End; Procedure Form_Massiv(Var Z:Massiv;D: Matrica; Var S, i, j: Integer; Begin For i:=1 to N Do Begin S:=0; For j:=1 to K Do S:=S+D[i,j]; Z[i]:=S; End; End; Begin Input(A,5,6); Input(B,7,5); Form_Massiv(E,A,5,6); Form_Massiv(F,B,7,5); Clrscr; Writeln(‘Матрица А’); Output(A,5,6); Writeln(‘Массив Е’); Output_Massiv(E,5); Readkey; Clrscr; Writeln(‘Матрица В’); Output(В,7,5); Writeln(‘Массив F’); Output_Massiv(F,7); Readkey; End. {заголовок программы} {объявление типа матрица с макс. числом} {строк и столбцов и типа массив} {объявление переменных} {процедура формирования матрицы} {указанной размерности} {N – число строк в матрице} {K – число столбцов в матрице} {формирование матрицы с помощью} {датчика случайных чисел} {процедура вывода матрицы нужной} {размерности} {N – число строк в матрице} {K – число столбцов в матрице} {процедура вывода массива указанной} {размерности} {N – число элементов в массиве} N, K: Integer); {процедура формирования} {массива из сумм эл-тов строк матрицы} {основная программа} (вызов процедуры форм-я для матрицы А) {вызов процедуры форм-я для матрицы В} {вызов проц. форм-я масс. Е из матр. А} {вызов проц. форм-я масс. F из матр. В} {очистка экрана} {вызов проц. вывода матр. для матр. А} {вызов проц. вывода масс. для масс. Е} {вызов проц. вывода матр. для матр. В} {вызов проц. вывода масс. для масс. F} {конец программы}

Подпрограммы: функции

Подпрограмма-функция предназначена для вычисления какого-либо значения. Функция, определенная пользователем, состоит из заголовка и тела функции. Заголовок функции:

function <имя_функции> (<список формальных параметров>): тип_возвр_значения;

Функция может возвращать значения следующих типов: любого порядкового, любого вещественного, типа string. Тело функции имеет структуру, аналогичную структуре программы на языке Pascal. При этом в разделе операторов в теле функции должен находиться, по крайней мере, один оператор, присваивающий имени функции значение. В основную программу возвращается результат последнего присваивания.

Обращение к функции осуществляется по имени в составе некоторого выражения с указанием списка фактических параметров.

Функция имеет четыре основных отличия от процедуры:

- заголовок;

- в теле функции хотя бы один раз (перед выходом из подпрограммы) имени функции должно быть присвоено значение;

- функция не имеет выходных параметров, она возвращает единственное значение (результат);

- вызов функции происходит в составе некоторого выражения внутри оператора, в то время как процедура не может выступать в качестве операнда в выражении.

Пример. Используя функцию, найти сумму чисел А и В, вводимых с клавиатуры.

Program Primer;

Uses Crt;

Var A, B, Summa: Integer;

Function Sum(C, D:Integer):Integer; {описание функции}

Var S:Integer; {для нахождения суммы двух чисел}

Begin

S:=C+D;

Sum:=S;

End;

Begin

Clrscr;

Writeln(‘Введите первое число’);

Readln(A);

Writeln(‘Введите второе число’);

Readln(B);

Summa:=Sum(A,B); {вызов функции}

Writeln(‘Сумма равна ’,Summa);

Readkey;

End.

Задача

Сформировать матрицы А{15,13} и В{5,7}. Вывести их. Используя функцию, найти максимальные элементы матриц.

а) Схема алгоритма основной программы:

б) Схема алгоритма функции поиска максимального элемента матрицы.

 

Схемы алгоритмов процедур формирования и вывода матрицы см. в Занятии 5.

Program Primer; Uses Crt; Type Matrica=array[1..15,1..13] of Integer; Var A, B: Matrica; Max1, Max2:Integer; Procedure Input(Var D:Matrica; N,K:Integer); Var i, j: Integer; Begin Randomize; For i:=1 to N Do For j:=1 to K Do D[i,j]:=Random(10)-5; End; Procedure Output(D:Matrica; N,K:Integer); Var i, j: Integer; Begin For i:=1 to N Do Begin For j:=1 to K Do Write(D[i,j]:4,’ ‘); Writeln; End; End; Function Max_Elem(D:Matrica; N,K:Integer) :Integer; Var i, j, max: Integer; Begin Max:=D[1,1]; For i:=1 to N Do For j:=1 to K Do If D[i,j]>Max Then Max:=D[i,j]; Max_Elem:=Max; End; Begin Input(A,15,13); Input(B,5,7); Clrscr; Writeln(‘Матрица А’); Output(A,15,13); Readkey; Clrscr; Writeln(‘Матрица В’); Output(В,5,7); Readkey; Max1:=Max_Elem(A,15,13); Max2:=Max_Elem(B,5,7); Writeln(‘Макс. элемент матрицы А равен Writeln(‘Макс. элемент матрицы B равен Readkey; End. {заголовок программы} {объявление типа - матрица} {объявление переменных} {процедура формирования матрицы} {указанной размерности} {N – число строк в матрице} {K – число столбцов в матрице} {формирование матрицы с помощью} {датчика случайных чисел} {процедура вывода матрицы заданной} {размерности} {N – число строк в матрице} {K – число столбцов в матрице} {функция поиска максимального} {элемента в матрице указанной} {размерности} {основная программа} (вызов процедуры форм-я для матрицы А) {вызов процедуры форм-я для матрицы В} {очистка экран} {вызов проц. вывода матр. для матр. А} {ожидание нажатия любой клавиш} {очистка экрана} {вызов проц. вывода матр. для матр. В} {ожидание нажатия любой клавиши} {вызов ф-ии Max_Elem для матрицы А} {вызов ф-ии Max_Elem для матрицы В} ’,Max1); {вывод максимума для матрицы А} ’,Max2); {вывод максимума для матрицы В} {ожидание нажатия любой клавиш} {конец программы}

Рекурсия

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

Пример. Вычислить n! (факториалом натурального числа n называют произведение чисел 1*2*3*4*…*n). Число n вводится с клавиатуры.

Program Rekursia; Uses Crt; Var N: Integer; F: Longint; Function Faktorial(N: Integer): Longint; Begin If N=1 Then Faktorial:=1 Else Faktorial:=N*Faktorial(N-1); End; Begin Clrscr; Writeln(‘Введите целое число N < 20’); Readln(N); F:=Faktorial(N); Writeln(‘N!=’,F); Readkey; End. {заголовок программы} {раздел описания переменных} {тип Longint – это целые числа} {в диапазоне -231…+ 231-1} {описание рекурсивной функции} {проверка условия завершения рекурсии} {рекурсивное вычисление n!} {начало основной программы} {ввод числа N с клавиатуры} {вызов функции}

После запуска программы на экран выводится сообщение «Введите целое число N < 20», затем с клавиатуры считывается значение целого числа N и в выражении F:=Faktorial(N) вызывается функция Faktorial с параметром-значением N. В подпрограмме-функции вычисления факториала проверяется условие N=1. Если оно выполняется, то имени функции Faktorial присваивается значение 1, на этом выполнение подпрограммы завершается. Если условие N=1 не соблюдается, то выполняется вычисление произведения N*Faktorial(N-1). Вычисление произведения носит рекурсивный характер, т. к. при этом осуществляется вызов функции Faktorial(N-1), значение которой вычисляется, в свою очередь, через вызов функции Faktorial(N-2), которая также будет вызывать функцию Faktorial(N-3), и т. д. до тех пор пока значение формального параметра N не станет равным 1. Т. к. базовая часть описания рекурсивной функции Faktorial определяет значение Faktorial=1 для N=1, то рекурсивные вызовы функции больше не выполняются, а наоборот, выполняется вычисление функции Faktorial для чисел, возрастающих от 1 до N, причем функция Faktorial всякий раз возвращает значение, равное произведению очередного k-ого числа на факториал от (k-1)-ого числа. Последнее возвращение результата вычисления функции Faktorial присвоит переменной F значение произведения всех чисел от 1 до N, т. е. факториал числа N.

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: