Базисные схемы обработки информации
Задачи для самостоятельного решения
При решении задач на рекурсию необходимо обосновать как то, почему программа заканчивает работу, так и то, почему после ее завершения будет получен требуемый результат.
При использовании схемы вычисления инвариантной функции
необходимо указать
множества ,
и
, функцию
и преобразование
(см. определение инвариантной функции) и
объяснить программную реализацию преобразования
.
Задача 7.7. Напишите рекурсивную программу, печатающую значение производной
многочлена степени в
заданной точке
. Коэффициенты многочлена хранятся в массиве
в порядке убывания степеней и являются целыми числами, так же как и
значение
. Величины
,
и элементы массива
изменять в
программе нельзя.
Указание
Пусть .
Продифференцируем по
равенство
и подставим затем
. Мы получим
следующие соотношения:
,
.
Воспользовавшись ими и формулами
,
,
легко определить рекурсивную функцию неотрицательного целого аргумента ,
для вычисления которой и пишется программа.
Задача 7.8. Напишите программу, возводящую целое число в целую
неотрицательную степень. Точные
пред- и постусловия требуемой программы таковы: ,
.
При написании программы величины
и
изменять не
разрешается, следует использовать инвариант
и ограничивающую функцию
.
Задача 7.9. Напишите программу, находящую наибольший общий делитель
двух целых неотрицательных чисел
и
, не равных одновременно нулю.
Воспользуйтесь следующим свойством наибольшего общего
делителя (докажите его!):




Задача 7.10. Напишите программу, возводящую целое число в целую
неотрицательную степень. Точные
пред- и постусловия требуемой программы таковы: ,
.
При написании программы величины
и
изменять не
разрешается. Воспользуйтесь тем, что
функция
,
является инвариантной
относительно преобразования
, задаваемого
формулой
.
Задача 7.11. Напишите программу, находящую наибольший общий делитель
двух целых неотрицательных чисел
и
, не равных одновременно нулю.
Программа должна иметь временную сложность порядка
и не использовать операций деления и нахождения остатка от деления
(допустимо деление пополам, реализуемое с помощью операции сдвига).
Воспользуйтесь следующими свойствами наибольшего общего
делителя (докажите их!):
,
.
Указание
Воспользуйтесь инвариантностью функции относительно
следующего преобразования
:


