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