FOJ 1042 Ackermann Function

最后自己得出的结论,双递归的深度不能超过3.否则层数将会以难以想象的速度趋向正无穷大!!

 

这题Ackerman函数是经典的一个双递归函数。

这题其实主要目的就是要让我们了解双递归函数的执行过程。

但是我们的代码当中并没有用到递归函数,这是为什么呢??

因为根据推倒可以得出,

当m=1的时候可以推导出2+n

当m=2的时候可以推导出3+n*2

当m=3的时候可以推导出

sum = 13;
   for (i=1;i<n;i++)
    sum += (int)pow(2,3+i);

 

之前我是用递归的方法做的,但是当m=3的时候,空间复杂度增加的非常快,最终将导致栈溢出。

引发Runtime Error.

 

那肯定大家想知道公式是怎么推的。。。

数学我是不好的。。

不过有个简单的办法。。

先用递归做。找出输出值的递增规律。从而推导出关系。。。

这个好像很不专业的样子。。。。

 

注意当m=3的时候,必须考虑n=0的情况。

#include <stdio.h> #include <math.h> int main() { int m,n,i; int sum; while (scanf("%d%d", &m,&n)!=EOF) { if (m==1) { printf("%d/n", 2+n); } else if (m==2) { printf("%d/n", 3+n*2); } else if (m==3) { if (n == 0) { printf("5/n"); continue; } sum = 13; for (i=1;i<n;i++) sum += (int)pow(2,3+i); printf("%d/n",sum); } } return 0; }

你可能感兴趣的:(FOJ 1042 Ackermann Function)