Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otchet_po_letney_praktike.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
933.1 Кб
Скачать
  1. Решение задачи «Функция Аккермана без рекурсии» с использованием языка программирования Pascal.

    1. Условие

Функция Аккермана А определена на всех неотрицательных целых аргументов 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) без использования рекурсии.

    1. Анализ задачи

По условию задачи видно, что необходимо заменить метод рекурсии на иной, который также вычислял бы A (m, n). Так как функция Аккермана возрастает очень быстро, то программе придется обрабатывать большие числа. Соответственно разработанный алгоритм должен производить вычисления за небольшой промежуток времени. Для замены рекурсии подходит метод стека, так как он часто используется для замены рекурсии и иногда называется «скрытой рекурсией»

    1. Реализация программы

      1. Выбор среды программирования

Для реализации задачи была выбрана среда программирования PascalABC.NET, так как данная среда программирования имеет схожий синтаксис со средой TurboPascal. В среде TurboPascal были приобретены необходимые навыки программирования позволяющие решить поставленную задачу. Также с помощью языка программирования PascalABC.NET возможно создания .exe-файла программы.

      1. Основные процедуры и функции

При создании программы необходимо было создать переменную своего типа.

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 условия. Первое из них проверяет на наличие ячейки стека, если же в стеке ничего нет, то данная программа завершится. В случае если стек не пустой программа будет пошагово проверять элемент функции Аккермана на принадлежность к одному из случаев данной функции.

Описание программного кода с подробными комментариями приведены в Приложении А Листинг программы «функция Аккермана без рекурсии».

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]