Тверской государственный университет
Опубликован: 21.08.2007 | Доступ: свободный | Студентов: 1684 / 243 | Оценка: 5.00 / 5.00 | Длительность: 14:18:00
ISBN: 978-5-94774-714-0
Специальности: Программист, Математик
Лекция 7:

Алгоритмы: структурированные программы

< Лекция 6 || Лекция 7: 12 || Лекция 8 >

Определение 7.6. Программа \Pi с входными переменными x1,..., xn и результирующей переменной y вычисляет частичную функцию F: n -> , если для любого набора значений аргументов a_{1},\dots ,a_{n}  (a_{i} \in    ), она переводит начальное состояние \sigma, в котором \sigma (x_{i})=a_{i} при 1<= i<= n и \sigma (z) = 0 при z \in  Var \setminus  \{ x_{1},\dots ,x_{n}\}, в состояние \sigma _{1}=\Pi (\sigma ) тогда и только тогда, когда (a_{1},\dots , a_{n}) \in   delta_{F} и F(a_{1},\dots , a_{n})= \sigma _{1}(y).

Функцию, вычисляемую программой \Pi с входными переменными x1,..., xn в (результирующей) переменной y, обозначим \Phi _{\Pi ,y}(x_{1}, \dots , x_{n}).

Арифметическая функция F(x1, ..., xn) программно вычислима, если она вычислима некоторой программой \Pi в некоторой переменной y при некотором разбиении переменных Var_{\Pi } на входные: x1,..., xn и вспомогательные.

Заметим, что в нашем языке нет понятия процедуры (подпрограммы). Для сокращения записи мы будем иногда использовать имя одной ранее написанной программы внутри текста другой: \Pi = \dots  \Pi _{1} ... Такая запись будет означать текстовую (in-line) подстановку текста (кода) программы \Pi _{1} в соответствующее место программы \Pi. Подчеркнем, что при этом переменные \Pi _{1} не переименовываются и программист сам должен заботиться о правильной инициализации переменных из Var_{\Pi 1}. Например, если \Pi использует отдельно написанную программу \Pi _{+} из приведенного ниже примера 7.3 для сложения переменных a и b и получения результата в t, то "безопасный" и корректный способ сделать это может выглядеть так:

\Pi: \ldots; x':=x; y':=y; z':=z; x:=a; y:=b;\Pi_+; t:=x; \\ x:=x'; y:=y'; z:=z'; \ldots

т.е. вначале сохраняются текущие значения переменных x,y,z, используемых в \Pi _{+}, затем входным переменным x и y присваиваются нужные значения a и b и вызывается \Pi _{+}, ее результат передается в t, затем восстанавливаются значения x,y,z.

Рассмотрим несколько примеров программ.

Пример 7.1.

\Pi _{0}:  x := 0

Ясно, что \Phi _{\Pi 0,x} (x) тождественно равна 0.

Пример 7.2.

\Pi _{1}:  x := x+1

А здесь \Phi _{\Pi 1,x}(x)= x+1 для любого x.

Пример 7.3.

\Pi _{+}:  пока  \ z < y \  делай \  z:=z+1; x := x+1 \ все

Зафиксируем входные переменные x, y и выходную переменную x ( z - рабочая переменная ). Легко показать, что \Phi _{\Pi +,x}(x,y)= x+y.

Действительно, при y=0 тело цикла не выполняется и выход равен x=x+0. При y >= 1 тело цикла выполняется y раз и при каждом его выполнении x увеличивается на 1.

Пример 7.4.

\Pi_4(n,i):\\ 
x_1 := x_1;\ldots ; x_n:= x_n; x_1:= x_i

\Pi _{4}(n,i) вычисляет в x1 функцию выбора i-го аргумента: \Phi_{\Pi 4}(n,i), x_1(x_1, ... , x_n)= x_i.

Пример 7.5.

\Pi_5(n):\\ 
x_1 := x_1;\ldots ; x_n:= x_n; \mbox{пока}\ x_1=x_1\ \mbox{делай}\ x_1:=x_1 \mbox{все}

Нетрудно понять, что \Pi _{5}(n) вычисляет нигде не определенную функцию от n переменных: \Phi_{\Pi 5}(n), x_1(x_1, ... , x_n)= \infty.

Задачи

Задача 7.1. Определите (по аналогии с п. (ж)) определения 7.5 семантику для программ вида

\Pi = пока x < y делай \Pi _{1} все.

Задача 7.2.Построить структурированные программы, вычисляющие в z следующие функции, и доказать их корректность:

  • f{x}(x,y)= x*y;
  • ffact(x)= x!;
  • f-1(x)= x dot{-} 1, где 0 dot{-} 1 = 0 и (x+1) dot{-} 1 = x ;
  • f-(x,y)= x dot{-} y, где x dot{-} y = x-y, если x >= y и x dot{-} y=0, если x < y ;
  • fsqr(x)= [sqrt x];
  • fexp(x)= 2x;
  • flog(x)= [log2x];
  • f/(x,y)= [x/y].

Задача 7.3. Пусть \Pi - структурированная программа и |Var_{\Pi }| = m. Из определений следует, что при различной фиксации входных переменных и выходной переменной программа может вычислять различные функции.

  • Каково максимальное число функций от n <= m переменных, которое может вычислять \Pi? Сколько всего разных функций может вычислить \Pi?
  • Постройте программу \Pi (m,n), которая вычисляет максимальное число различных функций от n <= m переменных.
  • Постройте программу \Pi (m) с |Var_{\Pi }| = m, которая для каждого n <= m вычисляет максимальное число различных функций от n переменных.

Задача 7.4.Построить структурированные программы, вычисляющие в z следующие функции:

  1. \begin{array}{lll}
f_1(x, y)& =& \left \{\begin{array}{ll}
             x^2y^3, & \text{ если   $x < y$ }  \\
\text{}
             [ (x+y)/2 ] , & \text{ в противном случае}
      \end{array}   \right. \\
\end{array}
  2. \begin{array}{lll}
f_2(x, y)& =& \left \{\begin{array}{ll}
             3^y, & \text{ если  $\log_2 (x+1) \geq y$ }\\
             |x -y|, & \mbox{ в противном случае}
      \end{array}   \right.\\
\end{array}
  3. \begin{array}{lll}
f_3(x, y) &=& \left \{\begin{array}{ll}
             [x*y/2], & \text{ если  $\log_2 x \leq y+2$ }\\
             x^{[y/2], & \mbox{ в противном случае}
      \end{array}   \right. \\
\end{array}
  4. \begin{array}{lll}
p(x) &=& \left \{\begin{array}{ll}
             1, &\ \ \  \mbox{ если $x$  --- простое число}\\
             0, &\ \ \ \mbox{ в противном случае}
      \end{array}   \right.
\end{array}

Задача 7.5. Пусть структурированная программа \Pi вычисляет в переменной y некоторую всюду определенную взаимно однозначную функцию f(x), область значений которой совпадает с множеством всех натуральных чисел N. Пусть Var_{\Pi }=\{ x, y, z_{1},\dots  , z_{m}\}. Постройте структурированную программу, которая вычисляет обратную функцию 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).

< Лекция 6 || Лекция 7: 12 || Лекция 8 >