5.5 Функция Аккермана
Еще один наглядный пример простого
алгоритма, но показывающего экспоненциальный взрыв времени вычисления.
Функци Аккермана относитс к классу
дважды рекурсивных и имеет следующий вид:

Ниже приведена рекурсивная функци
подсчета.
-
int Akk(int m,int
n)
{ //реализация подсчета функции Аккермана
if(m==0) return n+1;
if(n==0)
return Akk(m-1,1);
return
Akk(m-1,Akk(m,n-1));
}
Теперь необходимо вычислить
Akk(4,2)=?...попробуйте поэкспериментировать! Запишем вно функцию Аккермана для
фиксированных значений m (здесь приведены итоговые формулы, те кто хочет
проверить, может сделать это сам, использу метод математической индукции и
формулу геометрической прогрессии). - A(0,n)=n+1, при m=0
- A(1,n)=n+2, при m=1
- A(2,n)=2*n+3, при m=2
- A(3,n)=(2^n+3) - 3, при m=3
Теперь запишем выражение для A(4,2):
A(4,2)=A (3,A (4,1))=(2^A(4,1)+3)-3
A(4,1)=A (3,A (4,0))=(2^A(4,0)+3)-3
A(4,0)=A (3,1) = (2^1+3) - 3=16 -
3=13
A(4,1)=(2^13+3) - 3 = 65536 - 3
=65533
A(4,2)=(2^65533+3)-3Вот итоговый факт, для представлени
результирующего числа необходимо 65 килобит. Соответственно для подсчета такого
числа необходимо 2^65533+3 вызовов функции Akk! Вот это и есть экспоненциальный
взрыв!
|