- •Оглавление
- •Глава 1. Теоретические основы применения рекурсии в программировании 5
- •Глава 2. Рекурсия в среде программирования delphi 20 введение
- •Глава 1. Теоретические основы применения рекурсии в программировании
- •Рекуррентные формулы в математике
- •Рекурсивные алгоритмы и подпрограммы
- •Примеры рекурсивных программ
- •Рекурсия и итерация
- •Сложность рекурсивных вычислений
- •Метод «разделяй и властвуй»
- •Динамическое программирование
- •Глава 2. Рекурсия в среде программирования delphi
- •Организация рекурсивных процедур и функций в Delphi
- •Примеры рекурсивных алгоритмов, процедур и функций
- •Поиск элемента в упорядоченном массиве (двоичный поиск)
- •Ханойские башни
- •Размен денег.
- •Размен денег 2
- •Вычисление суммы элементов линейного массива
- •Рекурсивное определение наибольшего общего делителя двух натуральных чисел на основе алгоритма Евклида
- •Реализация Pascal в рекурсивном виде
- •Рекурсивное нахождение чисел Фибоначчи, принадлежащих указанному диапазону значений
- •Реализация Pascal в рекурсивном виде
- •Рекурсивное определение геометрической прогрессии
- •Реализация Pascal в рекурсивном виде
- •Построение правильного многоугольника
- •Построение окружностей
- •Заключение
- •Список литературы
Рекурсивное нахождение чисел Фибоначчи, принадлежащих указанному диапазону значений
Числа Фибоначчи — последовательность целых чисел , заданная с помощью рекуррентного соотношения
.
Последовательность чисел Фибоначчи начинается так:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233 … program Fibonachi;
Реализация 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.
Рекурсивное определение геометрической прогрессии
Геометри́ческая прогре́ссия — последовательность чисел (членов прогрессии), в которой каждое последующее число, начиная со второго, получается из предыдущего умножением его на определённое число (знаменатель прогрессии), где , : .
Сумма первых членов геометрической прогрессии:
Реализация 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.
Построение правильного многоугольника
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.