
- •Функції
- •Int swap(int, int) ;
- •Void func() ;
- •Int main()
- •Int main()
- •Int main()
- •Void func1(void); void func2(void); main() { func1(); func2(); return 0; } void func1(void) { /* тіло */ } void func2(void) { /* тіло */ }
- •Void fn(int I) { ... Fn(I); ... }
- •Void f(int I, int* j, int& k);
- •Int main()
- •Void f(int і, int* j, int& k)
- •Int anyfunc(void) { char item; ........ }
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>