Попробуйте (я использовал Visual Studio 2005)
template <int M, int N>
struct Ack
{
enum { value = Ack<M - 1, Ack<M, N - 1>::value >::value };
};
template <int M>
struct Ack<M, 0>
{
enum { value = Ack<M - 1, 0>::value };
};
template <>
struct Ack<0, 0>
{
enum { value = 1 };
};
template <int N>
struct Ack<0, N>
{
enum { value = N + 1 };
};
void main()
{
printf("Result: %d\n", Ack<150, 150>::value);
}
Это может показаться ужасным, я просто попытался написать эквивалент этой милой функции LISP
(defun ack(m, n)
cond ((= m 0) (+ n 1))
((= n 0) ack(- m 1) n)
(t (ack (- m 1) (ack m (-n 1))) )
)
Наш учитель сказал, что это функция Фермы, но я не уверен ...