- •Реферат
- •Содержание
- •Решение задач с использованием математического пакета MathCad
- •Построение графика функции одной переменной в декартовой системе координат
- •Построение поверхности
- •Построение графика параметрически заданной функции
- •Построение графика кусочно-непрерывной функции
- •Решение слау методом Крамера
- •Решение слау методом Гаусса
- •Матричные операции
- •Неопределённый интеграл
- •Неопределенный интеграл
- •Дифференцирование
- •Сплайн-интерполяция
- •Решение задачи «Функция Аккермана без рекурсии» с использованием языка программирования Pascal.
- •Условие
- •Анализ задачи
- •Реализация программы
- •Выбор среды программирования
- •Основные процедуры и функции
- •Интерфейс программы
- •Руководство пользователя
- •Список литератур
- •Приложение а – листинг программы «функция Аккермана без рекурсии»
Решение задачи «Функция Аккермана без рекурсии» с использованием языка программирования Pascal.
Условие
Функция Аккермана А определена на всех неотрицательных целых аргументов n и m следующим образом:
A (0, n) = n+1
A (m, 0) = A (m-1, 1) (m>0)
A (m, n) = A (m-1, A (m, n-1)) (m, n>0)
Разработать программу, которая вычисляет А (m, n) без использования рекурсии.
Анализ задачи
По условию задачи видно, что необходимо заменить метод рекурсии на иной, который также вычислял бы A (m, n). Так как функция Аккермана возрастает очень быстро, то программе придется обрабатывать большие числа. Соответственно разработанный алгоритм должен производить вычисления за небольшой промежуток времени. Для замены рекурсии подходит метод стека, так как он часто используется для замены рекурсии и иногда называется «скрытой рекурсией»
Реализация программы
Выбор среды программирования
Для реализации задачи была выбрана среда программирования PascalABC.NET, так как данная среда программирования имеет схожий синтаксис со средой TurboPascal. В среде TurboPascal были приобретены необходимые навыки программирования позволяющие решить поставленную задачу. Также с помощью языка программирования PascalABC.NET возможно создания .exe-файла программы.
Основные процедуры и функции
При создании программы необходимо было создать переменную своего типа.
type stack = ^el;
el=record
m,n:integer;
pr:stack;
end;
Данное действие описывает новый тип переменных stack. В данном типе хранится список переменных, а именно переменные m и n типа integer и переменную pr типа stack.
Так же использовалась процедура добавление ячейки в стек.
procedure add_stack(m,n:integer);
var q:stack;
begin
new(q);
q^.pr:=s;
q^.m:=m;
q^.n:=n;
s:=q;
end;
В данной процедуре использовалась переменная типа стек описанная ранее. В данной процедуре запоминаются текущие переменные m и n и создается новая ячейка для хранения последующих значений переменных m и n.
Также использовалась логическая функция извлечения ячейки из стека.
function return_stack(var m,n:integer):boolean;
var q:stack;
begin
if s = nil then begin
m:=0;
n:=0;
return_stack:=false;
end
else begin
m:=s^.m;
n:=s^.n;
q:=s;
s:=s^.pr;
dispose(q);
return_stack:=true;
end;
end;
В данной функции проверяется на наличие каких-либо значений в ячейке стека. Если стек пуст, то функции будет присвоено значение false. Иначе из ячейки стека будут извлечены значения переменных m и n, и ячейка стека будет удалена.
Для расчета значения элемента функции Аккермана используется цикл который работает пока не пуст стек.
while s<>nil do
begin
if return_stack(m,n) then
begin
if (n=-1) then n:=otv;
if m=0 then otv:=n+1 else
begin
if (m>0)and(n=0) then add_stack(m-1,1)
else begin
add_stack(m-1,-1);
add_stack(m,n-1);
end;
end;
end
else break;
end;
Повторяемость цикла реализована с помощью функции while. В данном цикле проверяются 4 условия. Первое из них проверяет на наличие ячейки стека, если же в стеке ничего нет, то данная программа завершится. В случае если стек не пустой программа будет пошагово проверять элемент функции Аккермана на принадлежность к одному из случаев данной функции.
Описание программного кода с подробными комментариями приведены в Приложении А Листинг программы «функция Аккермана без рекурсии».
