double Rec_Fact_Dn (double, int, int); //объявление функции (прототип)
main()
{ int i=50, n=i;
double Fact;
Fact= Rec_Fact (1.0, 1, n); //вызов функции
cout <<i << “! = ” << Fact << endl;
return 0;
}
double Rec_Fact_Dn(double Mult, int i, int m) //определение функции
{
Mult=Mult*i;
if (i==m) return Mult; else return Rec_Fact_Dn(Mult, i+1, m);
}
Рассмотрим таблицу трассировки значений параметров рекурсивной функции Rec_Fact_Dn по уровням рекурсии:
Текущий уровень рекурсии |
Рекурсивный спуск |
Рекурсивный возврат |
||
0 |
Ввод(m=5) |
Rec_Fact_Dn(1,1,5); |
Вывод m! = 120 |
|
1 |
Mult=1*1 (1); |
i =1; |
Rec_Fact_Dn(1,2,5); |
Rec_Fact_Dn=120; |
2 |
Mult=1*2 (2); |
i =2; |
Rec_Fact_Dn(2,3,5); |
Rec_Fact_Dn=120; |
3 |
Mult=2*3 (6); |
i =3; |
Rec_Fact_Dn(6,4,5); |
Rec_Fact_Dn=120; |
4 |
Mult=6*4 (24); |
i =4; |
Rec_Fact_Dn(24,5,5); |
Rec_Fact_Dn=120; |
5 |
Mult=24*5 (120); |
i =5; |
Rec_Fact_Dn=120; |
Rec_Fact_Dn=120; |
Пример 2. Третью форму рекурсивных подпрограмм рассмотрим на примере вывода на печать символов введенной строки ‘HELLO’ в обратном порядке:
#include <iostream.h>
#include <stdio.h>
void Reverse (); // прототип функции
main()
{ cout << “Input string:\n”;
Reverse();
cout << endl;
return 0;
}
void Reverse ();
{int ch;
if (( ch= getchar())!=’\n’) {Reverse(); putchar(ch); } }
Таблица трассировки данной программы по уровням рекурсии выглядит следующим образом:
Текущий уровень рекурсии |
Рекурсивный спуск |
Рекурсивный возврат |
0 |
Reverse; |
|
1 |
Ввод: ‘H’; ch !=’\n’; Reverse; |
Вывод: ‘H’ |
2 |
Ввод: ‘E’; ch !=’\n’; Reverse; |
Вывод: ‘E’ |
3 |
Ввод: ‘L’; ch !=’\n’; Reverse; |
Вывод: ‘L’ |
4 |
Ввод: ‘L’; ch !=’\n’; Reverse; |
Вывод: ‘L’ |
5 |
Ввод: ‘O’; ch !=’\n’; Reverse; |
Вывод: ‘O’ |
6 |
Ввод ‘\n’; ch ==’\n’; |
Следующая программа содержит описание рекурсивной функции возведения вещественного числа Х в целую степень N>=0 за минимальное число операций умножения.
#include <iostream.h>
#include <conio.h>
#include <math.h> double rec_degree(double, int );
main ()
{ double x, y;
int n; cout << “ Input (X<= 10) Input (-90<=N<=-90) ?: ” << endl ;
cin >> x >> n ;
y=rec_degree(x, abs(n)); if (n < 0) y = 1 / y; cout <<x << “ ” << n << “ “ << y << endl; getch();
return 0 ; }
double rec_degree(double x, int n) { double r;
if ( !n) return 1; //действия выполняются на рекурсивном возврате if ( !( n% 2)) return r=rec_degree(x, n/2), r*r ; //n – четное else return x *rec_degree(x, n-1); //n – нечетное }
Следующая программа содержит описание рекурсивной функции printd, которая вызывает себя, чтобы напечатать все старшие разряды заданного числа, а затем печатает цифру последнего разряда.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.