Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
14
Добавлен:
20.06.2014
Размер:
89.6 Кб
Скачать

Лабораторная работа №6

Тема: Программирование алгоритмов при помощи рекурсивных процедур и функций.

Цель работы: Познакомиться с понятием «рекурсия» и особенностями рекурсивных процедур и функций языка программирования Pascal:

  • Изучить понятия прямой и косвенной рекурсии;

  • Закрепить практические навыки работы в инструментальной среде Delphi на примере реализации алгоритмов при помощи рекурсивных процедур и функций.

Выполнил студент группы

Задание 1

Исходный код программы:

var k,n:integer; F:real;

function RecFact(n:integer): Longint;

begin

if n=0 then RecFact:=1 else RecFact:=n*RecFact(n-1)

end;

function NonRecFact(n:integer):Longint;

var p:integer;

Begin

p:=1;

while n>1 do begin

p:=n*p;

n:=n-1;

end;

NonRecFact:=p

End;

begin

write('Vibereti sposob resheniya (1,2): '); readln(k);

write('n= '); readln(n);

case k of

1: begin F:=NonRecFact(n); writeln('Povtorenie') end;

2: begin F:=RecFact(n); writeln('Rekursivnoe') end;

end;

writeln('F:=',F:10:0);

writeln('***End program***');

readln;

end.

Исходные данные:

Результаты расчёта:

Блок схема:

Задание 2

Исходный код программы:

var n,m,k:integer; F:real;

function RecNOD(n,m:integer):integer;

Begin

if n=m then RecNOD:=n else

if n>m then RecNOD:=RecNOD(n-m,m)

else RecNOD:=RecNOD(n,m-n)

end;

function NonRecNOD(n,m:integer):integer;

Begin

while n<>m do

if n>m then n:=n-m else m:=m-n;

NonRecNOD:=n

end;

begin

write('Vibereti sposob resheniya (1,2): '); readln(k);

write('n= '); readln(n);

write('m= '); readln(m);

case k of

1: begin F:=RecNOD(n,m); writeln('Povtorenie') end;

2: begin F:=NonRecNOD(n,m); writeln('Rekursivnoe') end;

end;

writeln('F:=',F:10:0);

writeln('***End program***');

readln;

end.

Исходные данные:

Результаты расчёта:

Блок схема:

Задание 3

Исходный код программы:

var F:real; n:integer;

function Fib(n:integer):integer;

var u,u0,u1,u2:integer; i:integer;

begin

u0:=1;

u1:=1;

for i:=3 to n do begin

u2:=u0+u1;

u0:=u1;

u1:=u2;

end;

Fib:=u2;

end;

begin

writeln('Chislo fibonachi= ',Fib(9));

readln;

end.

Исходные данные:

Результаты расчёта:

Блок схема:

Задание 4

Исходный код программы:

var n:integer;

function Eight(n:integer; a:real; b:real):real;

begin

if n=1 then Eight:=sqrt(6.0)

else Eight:=sqrt(a+b*Eight(n-1,a+1.0,b+1.0))

end;

begin

Write('Vvedite znachenie argumenta n: '); read(n);

Writeln('Rezultat: ',Eight(n,6.0,2.0)); readln;

end.

Исходные данные:

Результаты расчёта:

Блок схема:

Задание 5

Исходный код программы:

var x:integer;

function Eight(n:integer):real;

begin

if n=1 then Eight:=sqrt(8.0-sqrt(8.0+sqrt(8.0)))

else Eight:=sqrt(8.0-sqrt(8.0+sqrt(8.0-Eight(n-1))))

end;

begin

Write('Vvedite znachenie argumenta: '); Read(x);

Writeln('Rez:',Eight(x));

Writeln('Proverka: ',1.0+2.0*sqrt(3.0)*sin(3.141592653/9.0)); readln;

end.

Исходные данные:

Результаты расчёта:

Ответ

Функция вычисляет значение по формуле:

Таким образом при вводе любого числа функция будет принимать одно и тоже значение. Проверка результата происходит по формуле

. Отсюда получаем что Значение функции при любом входном параметре n будет равно значению выражения P.