Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Рекуррентные формулы. Рекурсивные алгоритмы и п...doc
Скачиваний:
11
Добавлен:
09.11.2019
Размер:
1.44 Mб
Скачать
    1. Рекурсивное нахождение чисел Фибоначчи, принадлежащих указанному диапазону значений

Числа Фибоначчи — последовательность целых чисел , заданная с помощью рекуррентного соотношения

.

Последовательность чисел Фибоначчи начинается так:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233 … program Fibonachi;

      1. Реализация Pascal в рекурсивном виде

program Fibonachi;

uses

SysUtils,

Windows;

type TVector = array [1..10000] of integer;

var arr:Tvector;

n:byte;

a,b:integer;

depth:Word;

function Fibon(n:byte):integer;

begin

Inc(depth);

if (n=0) or (n=1) then

Fibon:=1

else

Fibon:=Fibon(n-2)+Fibon(n-1);

end;

procedure vector_Fibon(var arr:TVector; a,b:longword; var n:byte);

var i,k:byte;

begin

k:=0;

for i:=1 to 30 do

if(Fibon(i)>=a) and (Fibon(i)<=b) then

begin

k:=k+1;

arr[k]:=Fibon(i);

end;

n:=k;

end;

procedure print_vector_Fibon(arr:Tvector; size:byte);

var i:byte;

begin

for i:=1 to size do

write(arr[i]:5);

end;

begin

SetConsoleOutputCP(1251);

writeln('Поиск чисел Фибоначчи в заданном диапозоне');

writeln;

writeln('Введите первую границу: ');

readln(a);

writeln('Введите вторую границу: ');

readln(b);

vector_fibon(arr,a,b,n);

writeln;

writeln('Глубина реккурсии: ', depth);

write('Числа Фибоначчи, расположенные в данном промежутке: ');

print_vector_fibon(arr,n);

readln;

end.

    1. Рекурсивное определение геометрической прогрессии

Геометри́ческая прогре́ссия — последовательность чисел (членов прогрессии), в которой каждое последующее число, начиная со второго, получается из предыдущего умножением его на определённое число (знаменатель прогрессии), где , : .

Сумма первых членов геометрической прогрессии:

      1. Реализация Pascal в рекурсивном виде

program Project3;

{$APPTYPE CONSOLE}

uses

SysUtils,

Windows;

var b,q: real;

n:integer;

S:real;

depth:Word;

function q_n(b,q:real; n:integer):real;

var i:integer;

res: real;

begin

Inc(depth);

If n=1 Then

res:=b

Else

res:=q_n(b,q,n-1)*q;

q_n:=res;

end;

function Summa(b,q: real; n: integer):real;

var s:real;

begin

s:=(b*(q_n(b,q,n)-1))/(q-1);

result:=s;

end;

begin

SetConsoleOutputCP(1251);

writeln('Проиграмма поиска суммы первых n элементов геометрической прогрессии.');

writeln;

writeln;

writeln('Введите первый элемент: ');

readln(b);

writeln('Введите знатель прогрессии: ');

readln(q);

writeln('Введите количество членов: ');

readln(n);

writeln;

if q = 1 then

S:=b*n

else

S:=summa(b,q,n);

writeln('Сумма ',n,' элементов равна: ',s:0:2);

writeln;

writeln('Глубина рекурсии: ',depth);

readln;

end.

    1. Построение правильного многоугольника

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls,Math;

type

TForm1 = class(TForm)

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Button1: TButton;

Label5: TLabel;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

x0,y0,r,Angle:real;

n,k,m,p : integer;

implementation

{$R *.dfm}

procedure point_n(k,n:integer;Angle,R: real); {задаем координаты вершин многоугольника}

var i:byte;

s:real;

x,y : integer;

x1,y1,x2,y2,x3,y3,Cos_Angle: Real;

begin

If k=1 Then

Begin

s:=2*Pi/n; i:=0;

x:=Round(x0+R*cos(i*s+Angle));

y:=Round(y0-R*sin(i*s+Angle));

Form1.Canvas.MoveTo(x,y);

for i:=1 to n+1 do

begin

x:=Round(x0+R*cos(i*s+Angle));

y:=Round(y0-R*sin(i*s+Angle));

Form1.Canvas.LineTo(x,y);

end;

End

Else

Begin

s:=2*Pi/n;

x:=Round(x0+R*cos(i*s+Angle));

y:=Round(y0-R*sin(i*s+Angle));

Form1.Canvas.MoveTo(x,y);

for i:=1 to n+1 do

begin

x:=Round(x0+R*cos(i*s+Angle));

y:=Round(y0-R*sin(i*s+Angle));

Form1.Canvas.LineTo(x,y);

end;

x1:=x0+R*cos(Angle);

y1:=y0-R*sin(Angle);

x2:=x0+R*cos(s+Angle);

y2:=y0-R*sin(s+Angle);

x3:=(m*x1+p*x2)/(m+p);

y3:=(m*y1+p*y2)/(m+p);

x1:=x0+R*cos(0);

y1:=y0-R*sin(0);

Cos_Angle:=((x1-x0)*(x3-x0)+(y1-y0)*(y3-y0))/Sqrt(((sqr(x1-x0)+sqr(y1-y0))*(sqr(x3-x0)+sqr(y3-y0))));

Angle:=ArcCos(Cos_Angle);

R:=Sqrt(sqr(x3-x0)+sqr(y3-y0));

point_n(k-1,n,Angle,R)

End;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

n:=StrToInt(Edit4.Text);

Form1.Canvas.Brush.Style:=bsSolid;

Form1.Canvas.FillRect(Form1.ClientRect);

Form1.Canvas.Brush.Style:=bsClear;

k:=StrToInt(Edit1.Text);

m:=StrToInt(Edit2.Text);

p:=StrToInt(Edit3.Text);

point_n(k,n,Angle,R);

Label1.Refresh;

Label2.Refresh;

Label3.Refresh;

Label4.Refresh;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

y0:=Form1.ClientHeight div 2;

x0:=y0;

R:=y0*0.9;

Angle:=0;

end;

end.