Лабораторная работа 4 РЕКУРСИЯ

реклама
Лабораторная работа 4
РЕКУРСИЯ
Рекурсией называется ситуация, когда процедура или функция
вызывает сама себя. Рекурсивный алгоритм обращается к самому себе, пока
не выполнится определенное условие, поэтому в любой рекурсивной
подпрограмме должна быть нерекурсивная ветвь (в примере 1 это: if N=1
then Fact:=1).
Пример 1.
Вычисление факториала натурального числа N.
N!=1*2*3*…*N
Вычисление факториала можно определить следующим образом:
еслиN  1, тоN!  1

еслиN  1, тоN!  N * ( N  1)!
N! = 
Program Pr1;
Var
N: integer;
Function Fact(N:integer):real;
begin
if N=1 then Fact:=1 else Fact:=N*Fact(N-1);
end;
BEGIN
{основная программа}
Write('N='); Readln(N);
Writeln(N, '!=', Fact(N):4:0);
Readln
END.
Пример 2.
Расчет суммы первых N натуральных чисел
Вычисление суммы 1+2+3+…+N можно определить следующим
образом:
еслиN  0, тоSum  0

еслиN  0, тоSum  N  Sum( N  1)
Sum(N) = 
Program Pr2;
Var
N: integer;
Function Sum(N: integer): integer;
begin
if N=0 then Sum:=0 else Sum:= N+Sum(N-1);
end;
BEGIN
{основная программа}
Write('N='); Readln(N);
Writeln('S=', Sum(N));
Readln
END.
Пример 3.
Вычисление n-го члена последовательности Фибоначчи.
Последовательность Фибоначчи определяется следующим образом:
первые два числа равны 1, а каждое следующее равно сумме двух
предыдущих (1, 1, 2, 3, 5,…).
Вычисление n-го члена последовательности Фибоначчи можно
определить следующим образом:
еслиN  1илиN  2, тоFib : 1

еслиN  2, тоFib : Fib(n - 1)  Fib(n - 2)
Fib(n)= 
Program Pr3;
Var
n:integer;
Function Fib(n:integer):integer;
begin
if n<=2 then Fib:=1 else Fib:=Fib(n-1)+Fib(n-2);
end;
BEGIN
{основная программа}
Write('n='); Readln(n);
Write(Fib(n):5);
Readln
END.
Пример 4.
Расчет n-члена арифметической прогрессии, заданной значением
первого члена a1 и разностью d.
Вычисление n-члена арифметической прогрессии можно определить
следующим образом:
 еслиN  1, тоan  a1
an = еслиN  1, тоa  a  d
n
n 1

Program Pr4;
Var
n:integer; d,a1:real;
Function Arifm(a1,d:real; n:integer):real;
begin
if n=1 then Arifm:=a1 else Arifm:=Arifm(a1,d,n-1) + d;
end;
BEGIN
{основная программа}
Write('a1='); Readln(a1);
Write('d='); Readln(d);
Write('n='); Readln(n);
Write(Arifm(a1,d, n):5:2);
Readln
END.
Пример 5.
Нахождения суммы n членов арифметической прогрессии, заданной
значениями первого члена прогрессии а и разности d.
Program Pr5;
Var
s,a,n,d: integer;
Function sa(n,a,d:integer):integer;
begin
if n>0 then sa:=a+ sa(n-1,a+d,d) else sa:=0;
end;
BEGIN
{основная программа}
Write('n='); Readln(n);
Write('a='); Readln(a);
Write('d='); Readln(d);
Write(sa(n,a,d));
Readln
END.
Пример 6.
Возведение числа a в целую степень n.
Program Pr6;
Var a:real;
n:integer;
Function Stepen(a: real;n:integer):real;
begin
if n=0 then Stepen:=1
else if n>0 then Stepen:=a*Stepen(a,n-1)
else Stepen:=(1/a)*Stepen(a,n+1);
end;
BEGIN {основная программа}
Write('a='); Readln(a);
Write('n='); Readln(n);
Write(Stepen(a,n):6:4);
Readln
END.
Пример 7.
Представление натурального числа в двоичной системе счисления.
Program Pr7;
Var
n:integer;
Procedure Bin_n(n:integer);
begin
if n>1 then Bin_n(n div 2);
Write( n mod 2)
end;
BEGIN
{основная программа}
Write('n='); Readln(n);
Bin_n(n);
Readln
END.
Пример 8.
Нахождения наибольшего общего делителя двух натуральных чисел
Program Pr8;
Var
a,b:integer;
Function Nod(a,b:integer):integer;
begin
if a=b then Nod:=a
else if a>b then Nod:=Nod(a-b, b)
else Nod:=Nod(a, b-a) ;
end;
BEGIN
{основная программа}
Write('a='); Readln(a);
Write('b='); Readln(b);
Writeln('NOD(', a, ',', b, ')=', Nod(a,b));
Readln
END.
Задания для самостоятельной работы
Вариант 1.
1. Вычислить (a! + b!)/a!, используя рекурсивную функцию вычисления
факториала
2. Составить рекурсивную функцию вычисления n-го члена
арифметической прогрессии 3, 7, … и вывести первые 10 членов
прогрессии.
Вариант 2.
1. Вычислить m!/(m + n)!, используя рекурсивную функцию вычисления
факториала
2. Составить рекурсивную функцию вычисления n-го члена
геометрической 1, 2, … и вывести первые 8 членов прогрессии .
Вариант 3.
1. Вычислить (1+2+3+4+5)/( 1+2+3+4+5+6+7+8), используя рекурсивную
функцию вычисления суммы первых n натуральных чисел.
2. Составить рекурсивную функцию вычисления n-го члена
последовательности: а1= 1, ai = ai-1*i. Найти сумму 2-го и 5-го членов
последовательности.
Вариант 4.
1. Составить рекурсивную функцию для вычисления S = 2 + 4 + 6 +…+24
2. Составить рекурсивную функцию вычисления n-го члена
последовательности: а1= 0, ai = 2*ai-1+i. Найти произведение 3-го и
7-го членов последовательности.
Вариант 5.
1. Составить рекурсивную функцию для вычисления S = 5 + 10 + 15
+…+55
2. Составить рекурсивную функцию нахождения суммы n членов
арифметической прогрессии 1, 3, …Найти сумму с 5-го по 10-й членов
прогрессии
Вариант 6.
1. Составить рекурсивную функцию для вычисления P = 2* 4* 6*…*12
2. Найти наибольший общий делитель для чисел A, B, C, используя
рекурсивную функцию нахождения наибольшего общего делителя
двух натуральных чисел
Вариант 7.
1. Вычислить (2+4+6+8)/( 2+4+6+8+10+12+14), используя рекурсивную
функцию вычисления суммы первых n натуральных четных чисел.
2. Составить рекурсивную функцию вычисления n-го члена
последовательности: а1= 0, ai = ai-1 +2*i. Найти сумму 2-го и 5-го
членов последовательности.
Вариант 8.
1. Составить рекурсивную процедуру, которая печатает введенное
натуральное число в восьмеричном представлении
2. Сократить дробь a/b (a, b – введенные натуральные числа), используя
рекурсивную функцию нахождения наибольшего общего делителя
двух натуральных чисел
Вариант 9.
1. Вычислить (1+3+5+7)/( 1+3+5+7+9+11+13+15), используя рекурсивную
функцию вычисления суммы первых n натуральных нечетных чисел.
2. Вычислить (42 + 23)/2-2 , используя рекурсивную функцию возведения в
степень
Вариант 10.
1. Среди чисел A, B, C, D найти пары взаимнопростых (у которых
наибольший общий делитель равен 1), используя рекурсивную
функцию нахождения наибольшего общего делителя двух натуральных
чисел
2. Вычислить (52 - 24)/(2-3 + 3-2 ), используя рекурсивную функцию
возведения в степень
Скачать