Автор работы: Пользователь скрыл имя, 29 Января 2014 в 16:39, лабораторная работа
Цель работы: изучить понятия рекурсии, рекурсивные функции в программировании, приемы построения рекурсивной функции при решении задач, научиться применять рекурсивные методы в решении задач на языке Паскаль.
Лабораторная работа №1
Рекурсивные функции
Цель работы: изучить понятия рекурсии, рекурсивные
функции в программировании, приемы построения
рекурсивной функции при решении задач,
научиться применять рекурсивные
методы в решении задач на языке Паскаль.
При выполнении лабораторной работы для каждого задания требуется написать программу на языке Паскаль, которая получает на входе числовые данные, выполняет их обработку в соответствии с требованиями задания и выводит результат на экран. Ввод данных осуществляется с клавиатуры с учетом требований к входным данным, содержащихся в постановке задачи. Ограничениями на входные данные является допустимый диапазон значений используемых числовых типов в языке Паскаль.
Общие сведения
При первичном осмыслении понятие рекурсии достаточно просто и не требует специальных знаний. Иногда на рекурсию смотрят как на наличие в определении объекта ссылки на сам объект или проявление свойств самоповторения (при этом сколь угодно малая часть объекта подобна всему объекту в целом). Общий случай проявления рекурсивности может быть сформулирован как наличие циклических взаимных обращений в определении объекта, которые в итоге замыкаются на сам объект.
В технике процедурного
программирования рекурсивность в построении подпрограмм
проявляется в разработке управляющих
структур, которые при выполнении обращаются
сами к себе непосредственно или через
цепочку других аналогичных структур.
Бесконечность и незавершенность таких
обращений кажущаяся, так как при достижении
определенных условий самовызовы завершаются.
Во многих конкретных случаях простыми
рассуждениями путем отслеживания значений
одной или нескольких управляющих величин
удается провести доказательство заверш
Рекурсивность в постановке задачи проявляется, если решение для общего случая сводится к аналогичным задачам для меньшего количества входных данных. В таком контексте под рекурсией понимают прием последовательного сведения решения некоторой задачи к решению совокупности "более простых" задач такого же класса и получению на этой основе решения исходной задачи.
Рекурсия в широком смысле – это определение объекта посредством ссылки на себя.
Рекурсия в программировании – это пошаговое разбиение задачи на подзадачи, подобные исходной.
Рекурсивный алгоритм – это алгоритм, в определении которого содержится прямой или косвенный вызов этого же алгоритма.
В языках программирования процедурной парадигмы предусмо
Функция называется рекурсивной
Процедуры и функции являются
«строительными блоками» для программ
и обеспечивают их модульность, а
потому представляют собой важнейшее
средство увеличения эффективности
программирования.
Перед выполнением работы необходимо ознакомиться с правилами оформления и вызова функций в языке программирования Паскаль.
Пример 1. Вычислить значения функции f(x)=2 cos x+3, при x={1; 4; 7,5; 20}. Вывести результаты в два столбца: в первом - значения x, во втором - значения f(x). Вычисления провести двумя способами: с помощью функции и процедуры.
Решение. Аргумент и результат функции – действительные числа, поэтому используем тип Real. В теле функции будет только оператор присваивания – для вычисления значения выражения. Процедура отличается строкой заголовка, - для передачи в основную программу результатов вычислений добавим параметр-переменную fx. Чтобы вывести результаты в виде таблицы, используем форматный вывод.
program proc_1;
function f (x: Real):Real;
begin f:=2*cos(x)+3 end;
procedure proc_f (x: Real; var fx: real);
begin fx:=2*cos(x)+3 end;
var x, fx: real;
begin
Writeln('с использованием процедуры:');
Writeln(' x f(x)');
x:=1; proc_f (x,fx);
Writeln (x:6:2, fx:6:2);
x:=4;
proc_f (x,fx); Writeln (x:6:2, fx:6:2);
x:=7.5;
proc_f (x,fx); Writeln (x:6:2, fx:6:2);
x:=20;
proc_f (x,fx); Writeln (x:6:2, fx:6:2);
Readln;
Writeln('с использованием функции:');
Writeln(' x f(x)'); Writeln(1:6, f (1):6:2);
Writeln(4:6, f (4):6:2); Writeln(7.5:6:2, f (7.5):6:2);
Writeln(20:6, f (20):6:2); Readln;
end.
Пример 2. Создать рекурсивную функцию поиска i-го члена последовательности, заданной рекуррентной формулой A1=const1, A2=const2, Ai=3Ai-2-Ai-1. Вывести через пробел значения рекурсивной функции при значениях аргумента от 1 до 10 включительно.
Решение. По условию задачи аргумент может принимать только целые значения, поэтому функция имеет параметр-значение типа Integer. Выход из рекурсии в данном случае осуществляется при двух значениях аргумента (при i=1, i=2), поэтому в рекурсивной функции необходимы два вложенных условных оператора или же оператор выбора case. В приведенном примере использованы операторы if, но попробуйте самостоятельно записать решение с помощью оператора выбора. В основной программе значения аргумента - целые последовательные числа, поэтому следует воспользоваться оператором цикла с параметром for.
program proc_2; function A (i: Integer): Integer; beginif i=1 then A:=1 elseif i=2 then A:=3 else А:=3*A(i-2)-A(i-1) end; var i: Integer; beginfor i:=1 to 10 do Write (A(i),' '); Readln
end.
Задание к работе
После рассмотрения данной темы проводится закрепление знаний, умений и навыков.
Методические указания
Задачу необходимо решать согласно рассмотренной технологии:
Содержание отчета
Варианты заданий
Задание 1. Составить программу для решения задачи с применением функции пользователя.
g(1.2+s)+g(ts)–g(2s–t), где g(a)=
где f(a, b, c)=
где g(a, b)=
где h(a,b)=
где sign a =
Задание 2. Вывести значения рекурсивной функции при значениях аргумента от 1 до 10 включительно.