在递归函数中,如何跳转到堆栈上的另一个函数调用?

时间:2019-05-22 21:59:39

标签: c++ c++11 c++14

为了使我的问题更清楚,我将举一个例子。假设我要实现一个递归函数,该函数将[1-10]和[15-20]之间的数字范围相加,跳过(10-15)。我想累加[15-20]并跳过(10-15)堆栈上的函数调用,然后继续[1-10]。我怎样才能做到这一点?

int summation(int x, int y) {
    if(x == y) return x;

    // Catch here and return sum of 15-20 back to calls of 1-10
    if(x == 10) 
        catch(int n) 
            return n;

    int sum = x + summation(x+1,y);

    // Skip function calls 10-15
    if(x==15) throw sum;

    return sum;

}

summation(1,20) // >> 160 or [1-10] = 55, [15,20] = 105 

我知道如何用另一种方法解决上面的示例,但是此示例给出了我想做的事情的想法。

3 个答案:

答案 0 :(得分:3)

为了在正确的堆栈帧中设置try / catch,在更深地递归之前,您需要知道跳过间隔的边缘。鉴于此,最好不要执行无用的函数调用,而不要使用异常解除它们。例如:

int summation(int const x, int const y)
{
    if(x == y) return x;
    int const next = (x==10)? 15: (x+1);  // skip from 10 to 15 directly
    return x + summation(next, y);
}

避免异常也使您可以递归编写尾部函数:

int summation(int const x, int const y, int partial_sum = 0)
{
    partial_sum += x;
    if(x == y) return partial_sum;

    int const next = (x==10)? 15: (x+1);  // skip from 10 to 15 directly
    return summation(next, y, partial_sum);
}

答案 1 :(得分:2)

使功能保持简单。

int summation(int x, int y) {
    if(x == y) return x;
    return x + summation(x+1,y);
}

并使用

summation(1, 10) + summation(15, 20);

在客户端。

您可以通过添加另一个处理要跳过的数字的功能来简化客户端。

int summation_with_skip(int x1, int x2, int x3, int x4) {
   return summation(x1, x2) + summation(x3, x4);
}

并使用

summation_with_skip(1, 10, 15, 20);

如果必须具有跳过功能中各项的逻辑,则可以使用

int summation_with_skip(int x1, int x2, int x3, int x4) 
{
   if ( x1 > x4 )
   {
      return 0;
   }

   int s = summation(x1+1, x2, x3, x4)

   if ( (x1 > x2) && (x1 < x3) )
   {
      return s;
   }
   else
   {
      return x1 + s;
   }
}

我喜欢将所有参数传递给函数的想法。

答案 2 :(得分:1)

好吧,这将是一个无需抛出和捕获的解决方案

对于给定的问题仍然是一个奇怪的解决方案

int summation(int x, int y) 
{
    if(x > y) return 0;

    if ((x >= 10) && (x <= 15))
    {
        return summation(x+1, y);
    }
    else
    {
        return x + summation(x+1, y);   
    }
}