为了使我的问题更清楚,我将举一个例子。假设我要实现一个递归函数,该函数将[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
我知道如何用另一种方法解决上面的示例,但是此示例给出了我想做的事情的想法。
答案 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);
}
}