这是一个执行递归的代码,它会为更大的值崩溃:
int rec(int m,int n)
{
if(m==0)
return n+1;
if(m>0 && n==0)
return rec(m-1,1);
if(m>0 && n>0)
return rec(m-1,rec(m,n-1));
}
如果我调用函数rec(m,n)
:
m=1
和n=2
,我得到的结果是4
m=2
和n=2
,7
,m=3
和n=2
,29
但崩溃了<{1}}和m=4
的。有另一种计算方法吗?
答案 0 :(得分:3)
Ackermann的函数可以非递归地表示为
Ack(m,n)=(2 op m (n + 3)) - 3
其中op m 是加法,乘法,取幂,塔函数等中的第m个算术运算......
换句话说,它的价值在瞬间爆炸,无法将这些数字表示为C ++整数。
有关解释,请参阅1990年代的主页:), (http://web.archive.org/web/20120315031240/http://members.fortunecity.com/alf_steinbach/content/programming/narrow_topics/ackermann/ackermann.html)
答案 1 :(得分:1)
rec(4,2)
-> rec(3, rec(4, 1))
->rec(3, rec(4, 0)
->rec(3, 1)
->rec(2, rec(3, 0))
->rec(2, 1)
->rec(1, rec(2, 0)) -->rec(1, 2) //return 4
->rec(1, 0) //return 2 -->rec(0, rec(1, 1)) //return 4
->rec(0, 1) //return 2 -->rec(0, rec(1, 0)) //return 3
-->return 2
这归结为:
rec(4,2)
-> rec(3, rec(4, 1))
->rec(3, rec(4, 0)
->rec(3, 1)
->rec(2, rec(3, 0))
->rec(2, 1)
->rec(1, 4)
这可以进一步解决,但空间不足,需要花费很多时间。 我预测您的应用程序会因堆栈溢出而崩溃,或者由于达到允许的递归限制而崩溃。 但我不能肯定地说...... @Cheers和hth。 - 阿尔夫以更微妙的方式在数学上解释它;)