Рекурсия алгоритмов Паскаль
Работа подпрограмм в Паскале. Пример программы с использованием рекурсии. Непосредственное завершение функции. Рекурсивная программа построения снежинки. Решение задач без использования циклов и применение рекурсии. Алгоритм вычисления функции.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | доклад |
Язык | русский |
Дата добавления | 06.02.2013 |
Размер файла | 240,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
КОЛЛЕДЖ ЭКОНОМИКИ, БИЗНЕСА И ПРАВА
КАРАГАНДИНСКОГО ЭКОНОМИЧЕСКОГО УНИВЕРСИТЕТА КАЗПОТРЕБСОЮЗА
Доклад
На тему: «Рекурсия алгоритмов Паскаль»
Выполнил
Учащийся группы ИС-33
Коврига Юрий
Караганда 2011г
Рекурсия Pascal-Паскаль
Подпрограммы в Паскале могут обращаться сами к себе. Такое обращение называется рекурсией.
Для того чтобы такое обращение не было бесконечным, в тексте подпрограммы должно быть условие, по достижению которого дальнейшее обращение к подпрограмме не происходит.
Пример.
Рассмотрим математическую головоломку из книги Ж. Арсака «Программирование игр и головоломок».
Построим последовательность чисел следующим образом: возьмем целое число i>1. Следующий член последовательности равен i/2, если i четное, и 3 i+1, если i нечетное. Если i=1, то последовательность останавливается.
Математически конечность последовательности независимо от начального i не доказана, но на практике последовательность останавливается всегда.
Применение рекурсии позволило решить задачу без использования циклов, как в основной программе, так и в процедуре.
Пример программы с использованием рекурсии
Program Arsac;
Var first: word;
Procedure posledov (i: word);
Begin
Writeln (i);
If i=1 then exit;
If odd(i) then posledov(3*i+1) else posledov(i div 2);
End;
Begin
Write (` введите первое значение '); readln (first);
Posledov (first);
Readln ;
End.
Программист разрабатывает программу, сводя исходную задачу к более простым. Среди этих задач может оказаться и первоначальная, но в упрощенной форме. Например, для вычисления F( N) может понадобиться вычислить F( N-1). Иными словами, частью алгоритма вычисления функции будет вычисление этой же функции.
Алгоритм, который является своей собственной частью, называется рекурсивным. Часто в основе такого алгоритма лежит рекурсивное определение.
Пример рекурсивного алгоритма
N! = ( N-1)!* N, если N=0, то N!= 1
Любое рекурсивное определение состоит из двух частей. Одна часть определяет понятие через него же, другая часть - через иные понятия.
Пример рекурсивного алгоритма
2n= 2 n-1*2, если n=0, то 2 n= 1
Процедура является рекурсивной, если она обращается сама к себе прямо или косвенно (через другие процедуры).
Заметим, что при косвенном обращении все процедуры в цепочке - рекурсивные.
Все сказанное о процедурах целиком относится и к функциям.
Пример рекурсивной функции вычисления факториала
Function factorial(N: integer) : longint;
Begin
If N= 0 then
Factorial := 1
Else Factorial := factorial(N-1) * N
End;
Рекурсия изнутри может показаться удивительным, но самовызов процедуры ничем не отличается от вызова другой процедуры. Что происходит, если одна процедура вызывает другую? В общих чертах следующее:
· в памяти размещаются параметры, передаваемые процедуре (но не параметры-переменные!);
· в другом месте памяти сохраняются значения внутренних переменных вызывающей процедуры;
· запоминается адрес возврата в вызывающую процедуру;
· управление передается вызванной процедуре.
Если процедуру вызвать повторно из другой процедуры или из нее самой, будет выполняться тот же код, но работать он будет с другими значениями параметров и внутренних переменных. Это и дает возможность рекурсии.
Пусть рекурсивная процедура Power( X, N, Y) возводит число X в степень N и возвращает результат Y .
Пример рекурсивной процедуры, возводящей число в степень
Procedure Power (X: real; N: integer; var Y: real);
Begin
If N=0 then
Y:= 1
Else Begin Power(X, N-1,Y);
Y:= Y*X;
End ;
End ;
Проследим за состоянием памяти в процессе выполнения вызова данной процедуры Power(5,3, Y). Стрелка «->» означает вход в процедуру, стрелка «<-» означает выход из нее.
Число копий переменных, одновременно находящихся в памяти, называется глубиной рекурсии. Как видно из примера, сначала она растет, а затем сокращается.
Подведем итог.
· рекурсивной называется такая процедура или функция, которая вызывает сама себя;
· для завершения процесса рекурсии в алгоритме рекурсивной функции (процедуры) обязательно должно быть условие, обеспечивающее непосредственное завершение функции (процедуры).
Напишем программу вычисления функции, заданной следующим образом:
F(1)=1; F(2n)=F(n); F(2n+1)=F(n)+F(n+1)
Решение: из определения видно, что вычисление функции от аргумента, сводится к вычислению этой же функции от меньшего аргумента, и процесс уменьшения аргумента продолжается до тех пор, пока в качестве аргумента не получится единица. Значение функции от единицы определено.
Таким образом, работа алгоритма будет состоять из некоторого количества шагов, на каждом из которых будут выполняться два действия:
· Определение четности или нечетности аргумента. От этого зависит выбор формулы вычислений;
· Выполнение вычислений. Фактически это будет сводиться к определению нового аргумента функции.
Пример рекурсивной программы вычисления функции
Program primer;
Uses crt;
Var
N, a: integer;
Function f(n:integer):integer;
Begin
If n =1 then
f :=1 {условие завершения рекурсии}
Else
Begin
If odd ( n ){проверка на нечетность числа}
then begin
n:= n div 2;
f:=f(n)+f(n+1)
end
else begin
n:= n div 2;
f:=f(n)
end;
end ;
end ;
begin {начало основной программы}
clrscr;
write(` Введите число - `);
readln(n);
a:=f(n);
write(` результат - `, a);
end.
Рекурсивная программа построения снежинки
Написать программу, строящую на экране изображение:
Изображение строится по следующему правилу: строится окружность с заданным радиусом r. Затем на диаметрально противоположных точках окружности ( x- r и x+ r)строится вновь окружность меньшего радиуса ( r=3 r/5). Для каждой меньшей окружности на диаметрально противоположных точках вновь строится окружность меньшего радиуса, и т.д., пока радиус не уменьшится до 10.
Пример рекурсивной программы построения окружностей
program recurs;
uses graph;
var x,y,r,d,m:integer;
procedure ris(x,y,r:integer);
var i:integer;
begin
if r<10 then exit;
circle(x,y,r);
for i:=1 to 1000 do; { просто цикл задержки }
ris(x+r,y,r*3 div 5);
ris(x-r,y,r*3 div 5);
end ;
begin {начало основной программы}
d:=detect;
initgraph(d,m,"e:\bp\bgi");
x:=320;
y:=240;
r:=120;
ris(x,y,r);
readln ;
end.
Как видно из рисунка, здесь опять повторяются одни и те же фрагменты. Построение выполняется так: на окружности заданного радиуса r берется 6 равноотстоящих точек (начиная от угла в 0 0, с шагом ?/3), из каждой точки к центру окружности проводятся радиусы. Затем каждая из этих точек выступает центром новой, меньшей окружности с радиусом r=2 r/5. На каждой меньшей окружности вновь берется 6 равноотстоящих точек, из которых строятся радиусы к центру, и т.д., пока радиус не станет меньше или равен 1.
Пример рекурсивной программы построения снежинки
program sneg;
uses graph, crt;
var
x,y,r,d,m:integer;
procedure ris(x,y,r:integer);
var
x1,y1,t:integer;
begin
if r<=1 then begin putpixel(x,y,15);exit end;
for t:=0 to 6 do
begin
x1:=x+trunc(r*cos(t*pi/3));
y1:=y+trunc(r*sin(t*pi/3));
line(x,y,x1,y1);
ris(x1,y1,r*2 div 5);
delay(500);
end;
end;
begin
d:=detect;
initgraph(d,m,"e:\bp\bgi");
x:=320;
y:=240;
r:=80;
ris(x,y,r);
readln;
end.
Пример «Кривой Дракона».
паскаль подпрограмма рекурсия алгоритм
Рассмотрим пример решения еще одной классической задачи: «Кривая Дракона».
Изображение кривой Дракона выглядит так:
Очень красиво, не правда ли. Разберемся, как же эта кривая получается.
Возьмем длинную полоску бумаги и сложим ее пополам, а затем развернем на 90. Если смотреть на полоску сбоку, то получится ломаная линия из двух перпендикулярных участков: см. рис. а. Теперь сложим полоску пополам дважды и также дважды развернем на 90 так, как это показано на рис. б. Получим ломаную линию уже из четырех отрезков, причем угол между смежными отрезками составляет 90. Наконец, если сложение и разворачивание полоски осуществить три раза, то в результате получится фигура, представленная на рис. в. Продолжая этот процесс, можно получить кривую, аналогичную той, которая представлена на рис. 1. Эту причудливую кривую называют кривой дракона. Способ построения подсказывает, что она не имеет самопересечений.
Кривая дракона впервые была описана в популярной литературе в журнале Scientific American в 1967 году. Заметка о ней появилась в колонке “Математические игры”, которую вел Мартин Гарднер. Первоначально использовалось полное название кривой - «дракон Хартера -- Хейтуэя», которое ей дал основатель компьютерной фрактальной геометрии Бенуа Мандельброт, именем которого названо знаменитое множество. В дальнейшем стали говорить просто о кривой дракона. Выше мы описали один из алгоритмов построения кривой. На наш взгляд, он несколько запутан (хотя и достаточно прост в реализации). Приведем описание алгоритма построение кривой, близкое к тому, которое использовалось Мартином Гарднером.
Рассмотрим горизонтальный отрезок как кривую дракона нулевого порядка. Разделим отрезок пополам и построим на нем прямой угол, как показано на рис. а).
Получим кривую дракона первого порядка. На сторонах прямого угла снова построим прямые углы (рис. б).
При этом вершина первого угла всегда находится справа, если смотреть из точки A (начала кривой) вдоль первого отрезка кривой, а направления, в которых строятся вершины остальных углов, чередуются. На рис. в) и г) показаны кривые дракона третьего и четвертого порядков соответственно.
Пример рекурсивной программы «Кривая Дракона»
program dragon;
uses graph;
var k,d,m:integer;
procedure ris(x1,y1,x2,y2,k:integer);
var xn,yn:integer;
begin
if k>0 then
begin
xn:=(x1+x2) div 2 +(y2-y1) div 2;
yn:=(y1+y2) div 2 -(x2-x1) div 2;
ris(x1,y1,xn,yn,k-1);
ris(x2,y2,xn,yn,k-1);
end
else begin line(x1,y1,x2,y2); end;
end;
begin
readln ( k );{задаем порядок кривой}
d:=detect;
initgraph(d,m,"e:\bp\bgi");
ris(200,300,500,300,k);
readln;
end.
Размещено на Allbest.ru
...Подобные документы
Использование рекурсии в предметных областях. Рекурсивные процедуры и функции в программировании. Создание алгоритмов для рисования графических изображений с использованием рекурсии в среде программирования Pascal ABC. Примеры рекурсии в графике.
творческая работа [6,7 M], добавлен 01.02.2014Организация вычислительного процесса, при котором подпрограмма в ходе выполнения составляющих ее операторов обращается сама к себе. Способы программирования алгоритмов с использованием рекурсии. Преимущества и недостатки использования рекурсии.
лабораторная работа [27,8 K], добавлен 28.05.2012Линейная программа на Паскаль, примеры составления алгоритмов вычисления и обмена значений переменных. Программа с ветвлениями и циклическая программа, массивы, процедуры и функции, файловые данные и записи в Паскале, строки, графика в Турбо-Паскале.
отчет по практике [99,8 K], добавлен 20.07.2010Международный стандарт на язык программирования Паскаль. Приемы объектно-ориентированного программирования в Турбо Паскале. Символы языка, его алфавит. Этапы разработки программы. Понятие алгоритмов и алгоритмизации. Структура программ на Паскале.
курсовая работа [29,8 K], добавлен 28.02.2010Программирование линейных и ветвящихся процессов; циклов с предусловием, постусловием и параметром для вычисления сложных сумм и произведений рядов; таблицы значений функции двух переменных. Блок-схемы алгоритмов. Тексты программ и результаты их работы.
курсовая работа [2,4 M], добавлен 11.03.2015Определение функции, ее прототип. Рекурсия - частичное определение объекта через себя. Рекурсивная функция произведения 2-х целых чисел. Задача о вычислении Факториала. Вычисление чисел Фибоначчи. Рекурсивное исполнение программы о Ханойских башнях.
презентация [1,2 M], добавлен 20.05.2012Алгоритм и программа вычисления функции на параллельной структуре. Разложение функции в ряд Маклорена. Однопроцессорный и многопроцессорный алгоритмы решения. Программа на Паскале. Размер буферной памяти между звеньями. Матрица вероятностных переходов.
контрольная работа [627,4 K], добавлен 14.02.2009Рассмотрение алгоритма, основанного на использовании рекурсивной функции. Пример построения простого самоподобного фрактала - ковра Серпинского, снежинки Коха, кривых Пеано и Гильберта. Понятие L-система и терл-графика. Составление программы "Koch.m".
курсовая работа [3,6 M], добавлен 14.12.2012Разработка и анализ алгоритмов с использованием электронных таблиц и прикладных программ Smath Studio, Microsoft Excel. Проверка алгоритма ветвления или выбора. Реализация циклов на примере вычисления определённого интеграла с заданной точностью.
контрольная работа [1,0 M], добавлен 19.03.2016Программирование на языке Паскаль: алфавит, решение задач, простейшие программы, разветвляющие программы, циклические программы, ввод-вывод, массивы, подпрограммы, строковые данные, записи, файлы, использование библиотеки CRT, графика в Паскале.
учебное пособие [211,1 K], добавлен 30.03.2008Исследование понятия рекурсии в программировании. Описание метода, который позволяет разбить задачу на части все меньшего и меньшего размера. Изучение схемы работы рекурсивной процедуры. Способы изображения древовидных структур. Избавление от рекурсии.
презентация [486,1 K], добавлен 22.10.2013Краткая характеристика интегрированной среды Turbo Pascal. Принципы программирования разветвляющихся алгоритмов, циклических структур, задач обработки символьных данных, множеств. Правила записи данных в текстовый файл. Понятие явной и косвенной рекурсии.
учебное пособие [1,5 M], добавлен 10.12.2010Предназначение цикла for - оформление циклов (набора действий) с заданным количеством повторений. Пример программы, выводящей на экран все целые числа от 0 до 99. Решение задачи с помощью двух алгоритмов, используя известные функции ввода-вывода.
лабораторная работа [35,1 K], добавлен 15.07.2009Особенности вычисления по формулам в Microsoft Visual Basic с использованием функции If. Применение циклов и разветвлений. Визуальные объекты, составление алгоритмов задачи, блок-схемы и программного кода. Введение переменных, определение типа данных.
лабораторная работа [558,5 K], добавлен 23.05.2014Принципы разработки математических моделей, алгоритмов и программ. Составление программы вычисления функции с использованием нестандартных функций. Нахождение значения корней нелинейного уравнения по методу касательных. Программа для вычисления интеграла.
курсовая работа [568,3 K], добавлен 07.03.2015Элементы и переменные, используемые для составления записи в Паскале. Основные числовые типы языка Turbo Pascal. Составление блок-схемы приложения, программирование по ней программы для вычисления функции. Последовательность выполнения алгоритма.
лабораторная работа [256,9 K], добавлен 10.11.2015Анализ функции и разработка алгоритма по ее вычислению. Программирование отдельных блоков и структур алгоритма. Структура Паскаль-программы. Раздел описаний, подпрограммы, тело программы. Полная Паскаль-программа в соответствии с разработанным алгоритмом.
курсовая работа [241,8 K], добавлен 30.01.2016Использование нестандартных функций и подпрограмм (процедур) для составления алгоритмов вычислений. Программы для вычисления значение корней нелинейного уравнения по методу половинного деления. Составление алгоритма операций над матрицами и интегралами.
курсовая работа [580,0 K], добавлен 23.08.2015Структура языка Паскаль, встроенные процедуры и функции. Составление алгоритма решения уравнения, описывающего работу кривошипно-шатунного механизма, с помошью метода итерации, метода Гаусса и метода Зейделя. Блок-схемы алгоритмов и текст программы.
курсовая работа [64,6 K], добавлен 07.05.2011Классификация и стек рекурсивных функций. Методика распознавания формулы, записанной в строке. Реализация салфетки Серпинского и задачи о Ханойских башнях. Алгоритм быстрой сортировки. Создание функции, сортирующей массив с использованием рекурсии.
лабораторная работа [160,8 K], добавлен 06.07.2009