Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Пример 4. Построение дерева

Пример 5. Рекурсивный узор

Пример 3. Нахождение НОДа

Пример 2. Вычисление факториала

Пример 1.

Рекурсия

 

Рекурсия относится к одному из фундаментальных понятий в математических и компьютерных науках. В языках программирования рекурсивной программой называют программу, которая обращается к самой себе. Рекурсивная программа не может вызывать себя до бесконечности, поскольку в этом случае она никогда не завершилась бы. Вторая важная особенность рекурсивной программы — наличие условия завершения, позволяющего программе прекратить вызывать себя.

 

Рекурсия бывает:

  • Прямая. Когда функция вызывает сама себя из своего же тела. Например:

void func()

{

func();

}

  • Косвенная. Когда функция вызывается из другой функции, вызов которой происходит из начальной функции. Например

void func()

{

tmp();

}

void tmp()

{

func();

}

 

Примеры использования рекурсии:

 

void print (int p)

{

if(p== 0) return;

printf ("%i", p);

print (p-1);

}

 

void main()

{

print();

}

 

 

int fact(int k)

{

if(k== 1) return 1;

else return k*fact(k-1);

}

 

void main ()

{

printf("%i",fact(3));

}

 

#include<conio.h>

#include<stdio.h>

 

int nod(int n, int m)

{

if (n==m) return m;

if (n>m) nod(n-m, m);

else nod(n, m-n);

}

//__________________________________________

void main()

{

clrscr();

int n=8, m=12;

printf("%i",nod(n,m));

}

Пример 4. Нахождение макс. элемента

Во множестве рекурсивных алгоритмах используется два рекурсивных вызова, каждый из которых работает приблизительно с половиной входных данных. Эта рекурсивная схема — один из более важных случаев хорошо известного метода "разделяй и властвуй". Давайте в качестве примера рассмотрим задачу отыскания максимального из N элементов, сохраненных в массиве а[0],..., a[N-l]. Эту задачу можно легко выполнить за один проход массива демонстрируется в примере:

int t;

for (t = a[0], i = 1; i < N; i++)

if (a[i] > t) t= a[i];

Еще один простой алгоритм решения той же задачи использует рекурсию только с целью иллюстрации концепции "разделяй и властвуй".

int t;

int findmax (int arr[], int l, int r)

{

if (l == r) return a[0];

int m = (l+r)/2;

int u = findmax (arr, l, m);

int v = findmax (arr, m+1, r);

if (u > v) return u; else return v;

}

 

#include <graphics.h>

#include <conio.h>

#include <dos.h>

#include <math.h>

#include <stdlib.h>

 

void uzor(int x, int y, int r, int p)

{

circle (x,y,z); // x,y - координаты центра

// r - радиус, p - текущий уровень вложенности

if(p>0)

{

uzor(x,y-r,r/4,p-1);

uzor(x-r,y,r/4,p-1);

uzor(x,y+r,r/4,p-1);

uzor(x+r,y,r/4,p-1);

}

 

}

void main()

{

int gdrive = DETECT, gmode;

initgraph(&gdrive,&gmode,"C:\\Lang\bc32\\BGI");

uzor(320,240,100,55);

Outtextxy(10,460,"press any key");

getch();

closegraph();

}

 

 

#include <graphics.h>

#include <conio.h>

#include <dos.h>

#include <math.h>

#include <stdlib.h>

 

int branch = 4; // количество веток в кусте

int branch_len = 70;

double alpha; // угол между ветками

 

void drawTree (int p, int ox, int oy, int len, double angle)

{

// p - уровень куста

if(p<1) return;

double beta = angle;

int px,py; // координаты конца ветки

for(int i=0, i<branch, i++)

{

beta+=alpha;

if(random(100)<75)

{

px = ox+(len*cos(beta))*1,3;

py = oy-(len*sin(beta))*1;

lime(ox,oy,px,py);

drawTree(p-1,px,py,len*0,75,beta-MPI_2);

}

}

}

 

void main()

{

//переход в графический режим

randomize();

int cx,cy,mx,my,sx,sy;

 

mx = getmaxx();

my = getmaxy();

 

cx = mx/2;

cy = my/2

 

sx = cx;

sy = cy*1.5;

 

line(mx,my,sx,sy);

alpha = M_PI/(branch+1);

drawTree(7,sx,sy,br_len,0);

 

getch();

close graph;

}

 

 

<== предыдущая лекция | следующая лекция ==>
Машинное представление графов | Алгоритмы с возвратом (back-tracking)
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 393; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.