为什么我在C中的递归函数会导致堆栈溢出?

时间:2015-11-25 18:16:17

标签: c function recursion stack-overflow

我试图计算x到幂n的函数(其中x可以是double,n必须是int)。递归算法将是this one,但在C中实现它会给出堆栈溢出错误。

我试着在这里找到答案,但我找到的最接近的是this,这并不能满足我的需求。

这是我的代码:

double power_adapted(double x, int n) {
    if (n == 0)
        return 1;
    else if (n == 1)
        return x;
    else if (n % 2 == 0)
        return power_adapted(power_adapted(x, n / 2), 2);
    else
        return x * power_adapted(power_adapted(x, (n - 1) / 2), 2);
}

2 个答案:

答案 0 :(得分:5)

递归调用总是将2作为n传递,因此它们将始终触发另一个递归调用。

我认为你误解了这个公式。我会把它解释为:

else if (n % 2 == 0) {
    double v = power_adapted(x, n / 2);
    return v * v;
}
else {
    double v = power_adapted(x, (n - 1) / 2);
    return x * (v * v);
}

答案 1 :(得分:3)

我不认为你想要完成的事情是有道理的。

如果你看看这部分代码,

else if (n % 2 == 0)
    return power_adapted(power_adapted(x, n / 2), 2);
else
    return power_adapted(power_adapted(x, (n - 1) / 2), 2);

虽然嵌套调用可能没有问题(作为语句),但外部调用始终为n = 2,基本情况依赖于n

解决问题:

通过查看提供的公式,我认为您应该有n == 2的基本案例来返回x * x(这是对算法的最简单的更改)。因此,算法可以表述如下:

double power_adapted(double x, int n) {
    if (n == 0)
        return 1;
    else if (n == 1)
        return x;
    else if (n == 2)
        return x * x;
    else if (n % 2 == 0)
        return power_adapted(power_adapted(x, n / 2), 2);
    else
        return x * power_adapted(power_adapted(x, (n - 1) / 2), 2);
}