В рассмотренных выше примерах при добавлении к последовательности еще одного элемента новое значение функции на последовательности можно было вычислить, зная только старое значение функции и добавленный элемент. Обозначим через Sn последовательность
Sn = {a0, a1, ..., an-1}
длины n. С помощью знака & обозначим операцию приписывания нового элемента справа к последовательности (ее называют также конкатенацией):
Sn+1 = Sn&an = {a0, a1, ..., an-1, an}
Пусть f(S) - некоторая функция на множестве последовательностей, например, сумма элементов последовательности. Функция называется индуктивной, если при добавлении нового элемента к последовательности новое значение функции можно вычислить, зная только старое значение функции и добавленный элемент. На математическом языке функция
f:Wà Y
где W - множество всех последовательностей, составленных из элементов некоторого множества X, индуктивна, если существует функция G от двух аргументов
G:Y*X àY
такая, что для любой последовательности S из W и любого элемента a из X значение функции f на последовательности S, к которой добавлен элемент a, вычисляется с помощью функции G:
f(S&a) = G(f(S), a)
Функция G по паре (y,a), где y - старое значение функции f на последовательности S и a - элемент, добавленный к последовательности, вычисляет новое значение y, равное значению функции f на новой последовательности.
В примере с суммой элементов последовательности функция G равна сумме элементов y и a:
G(y, a) = y+a
В примере с максимальным элементом последовательности функция G равна максимуму:
G(y, a) = max(y,a)
В примере со схемой Горнера вычисления значения многочлена в точке t, где коэффициенты многочлена заданы в последовательности по убыванию степеней, функция G равна
G(y, a) = yt+a
Во всех трех случаях рассматриваемая функция на последовательности индуктивна.
Общая схема вычисления значения индуктивной функции на последовательности выглядит следующим образом:
алгоритм значение индуктивной функции( вх: последовательность S)
| дано: последовательность S
| надо: вычислить функцию y = f(S)
начало алгоритма
| y := значение функции f на пустой последовательности;
| встать в начало последовательности S;
| цикл пока в последовательности S есть
| | непрочитанные элементы
| | прочесть очередной элемент
| | последовательности S в (вых:x);
| | y := G(y, x);
| конец цикла
| ответ := y;
конец алгоритма
Таким образом, для каждой конкретной индуктивной функции надо лишь правильно задать ее значение на пустой последовательности (инициализация) и определить, как новое значение функции вычисляется через старое при добавлении к последовательности очередного элемента, т.е. задать функцию G(y,x). Схема вычисления для всех индуктивных функций одна и та же.
Однако не все функции на последовательностях являются индуктивными. Рассмотрим следующий пример. Пусть коэффициенты многочлена заданы в последовательности по убыванию степеней. Надо вычислить значение производной многочлена в точке x = 2. Обозначим через
S = {a0, a1, ..., an}
последовательность коэффициентов многочлена
p(x) = a0xn+a1xn-1+...+an
и через f(S) значение производной многочлена p′(x) в точке x=2:
f(S) = p′(2)
Покажем, что функция f не индуктивна. Достаточно указать две последовательности S1 и S2, такие, что значения функции f на них совпадают, но при добавлении к последовательностям S1 и S2 одного и того же элемента a новые значения функции уже не равны:
f(S1) = f(S2),
f(S1&a)≠ f(S2&a)
Возьмем последовательности
S1 = {1},
S2 = {1, -4,1}
Им соответствуют многочлены
p1(x) = 1
p2(x) = x2-4x+1
Производные многочленов равны
p′(x) = 0,
p′2(x)= 2x-4
Значения обеих производных в точке x=2 равны нулю, т.е.
f(S1) = p′1(2) = 0,
f(S2) = p′2(2) = 2*2-4 = 0
Припишем теперь к обеим последовательностям элемент a = 1:
S1&1 = {1,1},
S2&1 = {1, -4,1,1}.
Новым последовательностям соответствуют многочлены
g1(x) = x+1,
g2(x) = x3-4x2+x+1
Их производные равны
g1(x) = 1,
g2(x) = 3x2-8x+1
Значения производных в точке x=2 равны соответственно
f(S1&1) = g′1(2) = 1
f(S2&1) = g′2(2) = 12-16+1 = -3
Мы видим, что значения f(S1) и f(S2) совпадают, но значения f(S1&1) и f(S2&1) не совпадают. Следовательно, функция f не индуктивна.