Россия |
Алгоритмы: структурированные программы
Определение 7.6.
Программа с входными переменными x1,..., xn и результирующей переменной y вычисляет частичную функцию F: n -> ,
если для любого набора значений аргументов
,
она переводит начальное состояние
в котором
при 1<= i<= n и
при
,
в состояние
тогда и только тогда, когда
и
.
Функцию, вычисляемую программой с входными переменными x1,..., xn в (результирующей) переменной y, обозначим
.
Арифметическая функция F(x1, ..., xn) программно вычислима, если
она вычислима некоторой программой в некоторой переменной y
при некотором разбиении переменных
на входные: x1,..., xn
и вспомогательные.
Заметим, что в нашем языке нет понятия процедуры (подпрограммы).
Для сокращения записи мы будем иногда использовать имя одной
ранее написанной программы внутри текста другой: . Такая запись будет означать текстовую (in-line) подстановку текста (кода) программы
в соответствующее место программы
Подчеркнем, что при этом переменные
не переименовываются и программист сам должен заботиться о правильной инициализации переменных из
.
Например, если
использует отдельно написанную программу
из приведенного ниже примера 7.3 для сложения переменных a и b и получения результата в t, то "безопасный" и корректный способ
сделать это может выглядеть так:

т.е. вначале сохраняются текущие значения переменных x,y,z,
используемых в , затем входным переменным x и y присваиваются
нужные значения a и b и вызывается
, ее результат передается в t,
затем восстанавливаются значения x,y,z.
Рассмотрим несколько примеров программ.
Пример 7.1.
Ясно, что тождественно равна 0.
Пример 7.2.
А здесь для любого x.
Пример 7.3.
Зафиксируем входные переменные x, y и выходную переменную x
( z - рабочая переменная ). Легко показать, что .
Действительно, при y=0 тело цикла не выполняется и выход равен x=x+0. При y >= 1 тело цикла выполняется y раз и при каждом его выполнении x увеличивается на 1.
Пример 7.4.

вычисляет в x1 функцию
выбора i-го аргумента:
.
Пример 7.5.

Нетрудно понять, что вычисляет нигде не определенную
функцию от n переменных:
.
Задачи
Задача 7.1. Определите (по аналогии с п. (ж)) определения 7.5 семантику для программ вида
пока x < y делай
все.
Задача 7.2.Построить структурированные программы, вычисляющие в z следующие функции, и доказать их корректность:
- f{x}(x,y)= x*y;
- ffact(x)= x!;
-
f-1(x)= x
1, где 0
1 = 0 и (x+1)
1 = x ;
-
f-(x,y)= x
y, где x
y = x-y, если x >= y и x
y=0, если x < y ;
- fsqr(x)= [sqrt x];
- fexp(x)= 2x;
- flog(x)= [log2x];
- f/(x,y)= [x/y].
Задача 7.3.
Пусть - структурированная программа и
. Из определений
следует, что при различной фиксации входных переменных и выходной переменной
программа может вычислять различные функции.
- Каково максимальное число функций от n <= m переменных, которое может вычислять
Сколько всего разных функций может вычислить
- Постройте программу
, которая вычисляет максимальное число различных функций от n <= m переменных.
- Постройте программу
с
, которая для каждого n <= m вычисляет максимальное число различных функций от n переменных.
Задача 7.4.Построить структурированные программы, вычисляющие в z следующие функции:
Задача 7.5.
Пусть структурированная программа вычисляет в переменной y некоторую всюду определенную взаимно однозначную функцию f(x), область значений которой
совпадает с множеством всех натуральных чисел N. Пусть
.
Постройте структурированную программу, которая вычисляет
обратную функцию f-1(x) = { z | f(z)=x}.
Задача 7.6. Пусть F(x) задана соотношениями F(0)=1, F(1)=1, F(x+2)= F(x)+F(x+1) (элементы последовательности F(x) называются числами Фибоначчи). Постройте структурированную программу, которая вычисляет функцию F(x).