Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 7 (Функції).docx
Скачиваний:
20
Добавлен:
16.05.2015
Размер:
74.76 Кб
Скачать

Void fn(int I) { ... Fn(I); ... }

      Непрямою рекурсією називається рекурсія, що здійснює рекурсивний виклик функції шляхом ланцюга викликів інших функцій. При цьому всі функції ланцюга, що здійснюють рекурсію, вважаються також рекурсивними.

void fnA(int i); void fnB(int i); void fnC(int i); void fnA(int i) {      ...      fnB(i);     ... } void fnB(int i) {      ...      fnC(i);     ... } void fnC(int i) {      ...     fnA(i);     ... }

      Якщо функція викликає сама себе, то в стеку створюється копія значень її параметрів, як і при виклику звичайної функції, після чого управління передається першому оператору функції. При повторному виклику цей процес повторюється.

     В якості прикладу розглянемо функцію, що рекурсивно обчислює факторіал. Як відомо, значення факторіала обчислюється за формулою:

N! = 1·2·…·(N-1)·N , причому 0!=1 і 1!=1.

Факторіал також можна обчислити за допомогою простого рекурентного співвідношення:

N! = N·(N-1)!

Для ілюстрації рекурсії скористаємося саме цим співвідношенням.

double fact(int n) {      if (n<=1) return 1;      return (fact(n-1)*n); } void main() {      int n;      double value;      clrscr();      printf("N=");      scanf("%d",&n);      value=fact(n);      printf("%d! = %.50g",n,value);      getch(); }

Самостійно (на лекції)!

Розробити рекурсивну функцію для виведення n-го числа з послідовності Фібоначчі.

Аргументи за замовчуванням

С++ допускає при виклику функцій опускати деякі її параметри. Досягається це зазначенням в прототипі функції значень аргументів за замовчуванням. Наприклад, функція, прототип якої наведено нижче, може при виклику мати різний вигляд в залежності від ситуації.

// Прототип функції:

void ShowInt (int i, bool Flag=true, char symbol='\n');

// Виклик функції ShowInt:

ShowInt(A, false, 'a');

ShowInt(B, false);

ShowInt(C);

Передавання параметрів

Механізм передавання параметрів є основним способом обміну інформацією між викликав і викликає функціями. Параметри, перераховані в заголовку опису функції, називаються формальними параметрами, або просто параметрами, а записані в операторі виклику функції - фактичними параметрами, або аргументами.

При виклику функції в першу чергу обчислюються вирази, що стоять на місці аргументів, потім в стеку виділяється пам'ять під формальні параметри функції відповідно до їх типу, і кожному з них присвоюється значення відповідного аргументу. При цьому перевіряється відповідність типів і при необхідності виконуються їх перетворення. При невідповідності типів видається діагностичне повідомлення.

Існує два способи передачі параметрів у функцію:

  • за значенням

  • за адресою.

При передачі за значенням в стек заносяться копії значень аргументів, і оператори функції працюють з цими копіями. Доступу до початкових значень параметрів у функції немає, а, отже, немає і можливості їх змінити.

При передачі за адресою в стек заносяться копії адрес аргументів, а функція здійснює доступ до комірок пам'яті за цими адресами і може змінити вихідні значення аргументів:

#іnclude <iostream.h>