簡體   English   中英

為什么我在C中的遞歸函數會導致堆棧溢出?

[英]Why does my recursive function in C cause a stack overflow?

我正在嘗試計算x到冪n的函數(其中x可以是double,n必須是int )。 遞歸算法就是這個算法,但在C中實現它會給出堆棧溢出錯誤。

我試着在這里找到答案,但我找到的最接近的是這個 ,這不符合我的需要。

這是我的代碼:

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作為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);
}

我不認為你想要完成的事情是有道理的。

如果你看看這部分代碼,

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM