Московский государственный индустриальный университет
Опубликован: 27.09.2006 | Доступ: свободный | Студентов: 3333 / 380 | Оценка: 4.17 / 3.79 | Длительность: 24:17:00
Специальности: Программист
Лекция 7:

Базисные схемы обработки информации

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

Задачи для самостоятельного решения

При решении задач на рекурсию необходимо обосновать как то, почему программа заканчивает работу, так и то, почему после ее завершения будет получен требуемый результат.

При использовании схемы вычисления инвариантной функции необходимо указать множества X, Y и X_P, функцию F и преобразование T (см. определение инвариантной функции) и объяснить программную реализацию преобразования T.

Задача 7.7. Напишите рекурсивную программу, печатающую значение производной многочлена степени n\geqslant0 в заданной точке x_0. Коэффициенты многочлена хранятся в массиве a в порядке убывания степеней и являются целыми числами, так же как и значение x_0. Величины n, x_0 и элементы массива a изменять в программе нельзя.

Указание Пусть P_n(x)=a_0x^n+a_1x^{n-1}+\ldots+a_{n-1}x+a_n. Продифференцируем по x равенство P_n(x) = x \cdot P_{n-1}(x) + a_n и подставим затем x=x_0. Мы получим следующие соотношения:

P'_0(x_0) = 0,

P'_n(x_0) = x_0 \cdot P'_{n-1}(x_0) + P_{n-1}(x_0).

Воспользовавшись ими и формулами

P_0(x_0) = a_0,

P_n(x_0) = x_0 \cdot P_{n-1}(x_0) + a_n,

легко определить рекурсивную функцию неотрицательного целого аргумента g\colon \mathbb{Z}_M
\rightarrow \mathbb{Z}_M \times \mathbb{Z}_M, g(n) =
(P'_n(x_0), P_n(x_0)) для вычисления которой и пишется программа.

Задача 7.8. Напишите программу, возводящую целое число в целую неотрицательную степень. Точные пред- и постусловия требуемой программы таковы: Q=(a\in \mathbb{Z}_M \land b\in \mathbb{Z}_M 
\land a > 0 \land b \geqslant 0), R=(z=a^b). При написании программы величины a и b изменять не разрешается, следует использовать инвариант I = 
(y \geqslant 0 \land z \cdot x^y = a^b) и ограничивающую функцию h = y.

Задача 7.9. Напишите программу, находящую наибольший общий делитель gcd(x,y) двух целых неотрицательных чисел x и y, не равных одновременно нулю. Воспользуйтесь следующим свойством наибольшего общего делителя (докажите его!):

gcd(x,y)=\begin{cases}
	gcd(x\%y,y),& \text{если $x\geqslant y$},\\
	gcd(x,y\%x),&  \text{иначе}.
	\end{cases}
Здесь операция x\%y позволяет найти остаток от деления x на y.

Задача 7.10. Напишите программу, возводящую целое число в целую неотрицательную степень. Точные пред- и постусловия требуемой программы таковы: Q=(a\in \mathbb{Z}_M \land b\in \mathbb{Z}_M 
\land a > 0 \land b \geqslant 0), R1=(z=a^b). При написании программы величины a и b изменять не разрешается. Воспользуйтесь тем, что функция F\colon \mathbb{Z}_M\times\mathbb{Z}_M\times\mathbb{Z}_M
\rightarrow \mathbb{Z}_M, F(x,y,z) = zx^y является инвариантной относительно преобразования T\colon \mathbb{Z}_M\times\mathbb{Z}_M\times\mathbb{Z}_M
\rightarrow \mathbb{Z}_M\times\mathbb{Z}_M\times\mathbb{Z}_M, задаваемого формулой T(x,y,z)=(x,y-1,xz).

Задача 7.11. Напишите программу, находящую наибольший общий делитель gcd(x,y) двух целых неотрицательных чисел x и y, не равных одновременно нулю. Программа должна иметь временную сложность порядка \Theta(\log \max(x,y)) и не использовать операций деления и нахождения остатка от деления (допустимо деление пополам, реализуемое с помощью операции сдвига). Воспользуйтесь следующими свойствами наибольшего общего делителя (докажите их!):

gcd(2x,2y)=2gcd(x,y), \qquad gcd(2x, 2y+1)=gcd(x,2y+1).

Указание Воспользуйтесь инвариантностью функции F(x,y,z)=z\cdot gcd(x,y) относительно следующего преобразования T:

T(x,y,z)=\begin{cases}
	(x/2,y/2,2z),& \text{если оба числа $x$ и $y$ — четны},\\
	(x/2,y,z),  & \text{если $x$ — четно, а $y$ — нечетно},\\
	(x,y/2,z),  & \text{если $x$ — нeчетно, а $y$ — четно},\\
	(x-y,y,z), & \text{если $x$ и $y$ — нечетны и $x\geqslant y$},\\
	(x,y-x,z), & \text{если $x$ и $y$ — нечетны и $x < y$}.
	\end{cases}
Не забудьте доказать T,-инвариантность функции F.

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >
Анастасия Халудорова
Анастасия Халудорова
екатерина яковлева
екатерина яковлева