Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпаргалка по программированию.DOC
Скачиваний:
50
Добавлен:
01.05.2014
Размер:
1.9 Mб
Скачать

Примеры задач с индуктивными функциями

Пример 1. Вычисл значения полинома, заданного после- довательностью коэффициентов по убывающим степеням.

Пусть  x1 x2 … xn  1 xn  и p(; t) = x1 n  1 x2 t n  2 + ... + xn  1 t + xn.

Рассмотрим f() = p(; t), тогда f(*x) = x1 n x2 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(findo

begin

Read(finx);

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 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(findo

begin

Read(finx);

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(0t + f(0) = f1() t + 0 для всех t  R следует f1() = 0. Тогда для вычисления F() имеем программу

Reset(fin);

y := 0; {f() = 0} y1 := 0; {f1() = 0}

while not Eof(findo

begin

Read(finx);

y1:= y1*t + y;

y := y*t + x

end {while} {f() & y1= f1()}

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

Билет№25 Пример вычисл индук ф-ции : задача о равнинах №25

Пример 3. Вычисление максимальной длины равнины (площадки) в заданной последовательности. Пусть задана последовательность  x1 x2 … xn  1 xn . Площадкой длины k называется отрезок (связная подпоследовательность) равных элементов, т. е. xi = x+ 1 = … = xi +  1 (при этом либо i = 1, либо xi 1  x , а также либо xi +  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(findo

begin

Read(finx);

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(km) =  ik..m xi, где 1  k  m  n. Тогда f() = max(S(km): 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(jn): 1  j  n).

Вычисление f и t можно проводить следующим образом: f(*x) = max(f(), t(*x)),

t(*x) = max(xx + t()),

t() = 0, f() =  .

В результате получим программу

const MinInt = 32768; {}

var  x,{ очередной элемент последовательности }

y, { f() }

z:Integer; { t() }

fin: Text; { input file}

begin ...

Reset(fin); { L(fin) =  }

y := MinInt; z := 0; { f(), t() }

{ inv: y = f(L(fin)) & z = t(L(fin)) }

{ bound: length(R(fin)) }

while not Eof(findo

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