Лабораторная работа 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 ), используя рекурсивную функцию возведения в степень