Увод в програмирането
alpha
|
Един обект е рекурсивен, ако частично се съдържа в сеже си или е дефиниран с помощта на себе си.
C/C++ поддържа две езикови конструкции, които позволяват да се реализират рекурсивни алгоритми - рекурсивни функции и структори с рекурсия.
Функция, която се обръща пряко или косвено към себе си , се нарича рекурсивна.
При всяко рекурсивно обръщение в програмния стек се разпределя памет за параметрите и вътрешните променливи. Използването на рекурсия води до увеличване производителността на програмисткия труд ( обикновено рекурсивните алгоритми са по-кратки ).
Но рекурсията не води до ефиктивни програми, защото при нея се използва повече памет и е необходимо повече време за изпълнение на програмата.
За да бъде една функция рекурсия, то трябва тя да бъде дефинирана рекурсивна.
Пример за нерекурсивна функция пресмятащата n! .
long fact ( int n) { int i; long f = 1; for ( i = 2; i<=n; i++ ) f = f * i; return f; }
Пример за рекурсивна функция пресмящата n! :
long fact( int n ) { if ( n == 0 ) return 1; else return ( n * fact( n - 1 ) ); }
Да се състави програма, в която чрез рекусивна функция се определя НОД на две цели неотрицателни числа, които не са едновременнно равни на 0.
За пресмятане ще използваме следната рекурсивна дефиниция:
НОД ( m, n ) =
Код:
#include <iostream.h> int nod ( int m, int n) { int result; if ( n == 0 ) result = m; else if ( n > m ) result = nod ( n, m ) ; else result = nod ( n, m % n); return result; } void main() { int m, n; do{ cout<<" m= "; cin>> m; cout<<"n = "; cin>> n; } while ( m < 0 || n < 0 || ( m == 0 && n == 0 ) ); cout<<"\n НОД = "<< nod ( m, n ) << endl; }