- •Билет №8 Вычисления с вещественными числами и машинное эпсилон №8
- •Машинное эпсилон может быть вычислено с помощью следующей программы:
- •Билет №9 Общая схема итерации и №9 рекуррентные вычисления
- •Вычисления с целыми числами
- •Билет№10 Схема интерации. Вычисление частичной суммы (вещ числа) №10
- •Общая формулировка задания
- •Пример выполнения задания
- •Вопрос №12 . Основные правила аналитической верификации программ №12
- •Вопрос №14 Ограничивающая ф-ция оператора цикла.Примеры №14
- •Билет№15. Теорема о цикле, его инварианте и ограничивающей функции №15
- •Билет №17 Теорема о цикле repeat- until ,его инварианте и ограничивающей его ф-ции. Аннотирование цикла и понимание аннотации №17
- •Вопрос№18 Алгоритм анализа двоичной записи натурального числа в двоичной сист счисления №18
- •Последовательности и файлы
- •Индуктивные функции
- •Стационарные значения индуктивных функций
- •Индуктивные расширения функций
- •Примеры задач с индуктивными функциями
- •Кванторы и запись утверждений о массивах
- •Правила вывода для цикла с параметром
- •Примеры программ работы с массивами
- •Решение последовательными обменами
- •Задача перестановки сегментов разной длины (второе решение)
- •Задача перестановки сегментов разной длины (третье решение)
- •Билет№35 Задача о равнинах (с испол массива) №35
- •Линейный поиск
- •Оптимизация программы бинарного поиска
- •Билет№44 Массивы в качестве параметров:открытые массивы №44 Сведения о массивах в языке Паскаль
- •Билет№45 Двумерные (многомерные массивы). Индексация. Исполбзование процедур. Задача: о МиниМаксе(матрица как массив строк) №45 обработка двухмерных массивов
Примеры задач с индуктивными функциями
Пример 1. Вычисл значения полинома, заданного после- довательностью коэффициентов по убывающим степеням.
Пусть = x1 x2 … xn 1 xn и p(; t) = x1 t n 1 + x2 t n 2 + ... + xn 1 t + xn.
Рассмотрим f() = p(; t), тогда f(*x) = x1 t n + x2 t n 1 + ... + xn 1 t2 + xn t + x =
= f() t + x. (3.1)
Из f(1) = x1 = f() t + x1 следует f() = 0 для всех t.
Эти соотношения лежат в основе следующей программы вычисления значения полинома (t задано). Эту программу естественно назвать схемой Горнера. |
Reset(fin); y :=0; {f()=0} while not Eof(fin) do begin Read(fin, x); y := y*t + x end {while} {y = p(; t)} |
Простым и показательным примером практического использования данной вычислительной схемы является чтение натурального числа z, представленного в текстовом файле записью в позиционной системе счисления с основанием q (2 q qmax), т. е. z = <x1 x2 ... xn 1 xn>q , где xi 0..(q 1) для i 1..n и x1 0.Очевидно, что z = x1 q n 1 + x2 q n 2 + ... + xn 1 q + xn и может быть вычислено по схеме Горнера:
const q = 3; {2 q 10} var x: Char; z: Integer; y: Word; fin: Text; begin Assign(fin, 'Number.dat'); Reset(fin); y :=0; while not Eof(fin) do begin Read(fin, x); z := Ord(x) 48; y := y*q + z end {while}; WriteLn('прочитано число = ', y) end. |
Пример 2. Вычисление значения производной полинома, заданного последовательностью коэффициентов по убывающим степеням.
Можно рассмотреть f1() = pt(; t) как новую ф-цию и попытаться для неё решить задачу заново, а можно поступить иначе продифференцировать по t уже полученное рекуррентное соотношение (3.1):
[f(*x)]t = [f()]t t + f(),
т. е. f1(*x) = f1() t + f(). Ф-ция f1 неиндуктивна, и следует рассмотреть индуктивное расширение F() = (f1() , f()): F(*x) = ( f1() t + f(), f() t + x).
Из соотношений f1(1) = [x1]t = 0 = f1(0) t + f(0) = f1() t + 0 для всех t R следует f1() = 0. Тогда для вычисления F() имеем программу
Reset(fin);
y := 0; {f() = 0} y1 := 0; {f1() = 0}
while not Eof(fin) do
begin
Read(fin, x);
y1:= y1*t + y;
y := y*t + x
end {while} {y = f() & y1= f1()}
Полученную программу можно назвать схемой Горнера для вычисления значения производной многочлена.
Билет№25 Пример вычисл индук ф-ции : задача о равнинах №25
Пример 3. Вычисление максимальной длины равнины (площадки) в заданной последовательности. Пусть задана последовательность = x1 x2 … xn 1 xn . Площадкой длины k называется отрезок (связная подпоследовательность) равных элементов, т. е. xi = xi + 1 = … = xi + k 1 (при этом либо i = 1, либо xi 1 xi , а также либо xi + k 1 xi + k, либо i + k 1 = n). Функция f = «длина самой длинной площадки в » неиндуктивна. Чтобы показать это, воспользуемся критерием индуктивности. Действительно, пусть
= (1, 1), = (2, 2),
f() = 2, f() = 2.
При x = 1 получим f(*x) = 3 и f(*x) = 2, т. е. f(*x) f(*x) , и, следовательно, f неиндуктивна.
Рассмотрим индуктивное расширение:
F() = ( f(), last(), конкурент()),
где last() последний элемент последовательности, а конкурент() длина хвостовой площадки (только площадка, заканчивающаяся последним элементом, может конкурировать с текущим рекордом f()).
Запишем рекуррентные (индуктивные) соотношения:
f(*x) = max(f(), конкурент(*x)),
конкурент() + 1, если x = last(), конкурент(*x) =
1, если x last(),
last(*x) = x.
Все эти ф-ции на пустой последовательности можно доопределить согласованно с индуктивными соотношениями: f() = 0, конкурент() = 0, last() = 0.
Тогда получаем программу
Reset(fin);
y := 0; {f() = 0}
z := 0; {z конкурент, z() = 0}
last :=0; {last() любой}
while not Eof(fin) do
begin
Read(fin, x);
if x = last then z := z + 1
else z := 1;
if z > y then y := z;
last := x
end {while}
Билет№26 Пример вычисл индуктив ф-ции:задача об отрезке с максимальной суммой №26
Пример 4. Вычисление максимальной суммы Эл-тов среди всех отрезков последовательности. Пусть задана последовательность = x1 x2 … xn 1 xn . Требуется вычислить f() = «сумма элементов отрезка с максимальной суммой», где отрезок связная подпоследовательность последовательности .
Пусть S(k, m) = ik..m xi, где 1 k m n. Тогда f() = max(S(k, m): 1 k m n).Функция f – неиндуктивна. Действительно, по критерию индуктивности: пусть = (5, 1), = (1, 5), f() = 5, f() = 5, но при x = 1 получим f(*x) = 5 и f(*x) = 6, т. е. f(*x) f(*x), и, следовательно, f неиндуктивна.
Рассмотрим индуктивное расширение F() = ( f(), t()), где роль потенциального конкурента текущему рекорду f() при продолжении последовательности играет t() максимальная сумма среди отрезков, прилегающих к правому концу последовательности, т. е. t() = max(S(j, n): 1 j n).
Вычисление f и t можно проводить следующим образом: f(*x) = max(f(), t(*x)),
t(*x) = max(x, x + t()),
t() = 0, f() = .
В результате получим программу
const MinInt = 32768; {}
var x,{ очередной элемент последовательности }
y, { y = f() }
z:Integer; { z = t() }
fin: Text; { input file}
begin ...
Reset(fin); { L(fin) = }
y := MinInt; z := 0; { y = f(), z = t() }
{ inv: y = f(L(fin)) & z = t(L(fin)) }
{ bound: length(R(fin)) }
while not Eof(fin) do
begin
Read( fin, x );
if z > 0 then z := z + x else z := x;
if z > y then { обновить рекорд } y := z;
end { while }…
end.
Билет№27 Кванторы существования.всеобщности и счёта,их использование при записи утверждение о массивах №27