如何计算这个长递归

时间:2014-03-02 13:51:55

标签: c++ recursion

这是一个执行递归的代码,它会为更大的值崩溃:

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=1n=2,我得到的结果是4
  • m=2n=27
  • m=3n=229

崩溃了<{1}}和m=4。有另一种计算方法吗?

2 个答案:

答案 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。 - 阿尔夫以更微妙的方式在数学上解释它;)