2013-03-06 168 views
2

我寫了下面這個簡單的函數來執行模冪運算。但是,當指數參數大於約261,000時,它會發生段錯誤。爲什麼是這樣?我該如何解決它?這個函數爲什麼會導致段錯誤?

我正在使用64位Ubuntu上的gcc進行編譯。

感謝

unsigned int modex(unsigned int base, unsigned int exponent, unsigned int modulus) 
{ 
    if(exponent == 1) 
     return base; 

    base = base % modulus; 

    if(exponent == 0 || base == 1) 
     return 1; 

    return (modex(base, exponent - 1, modulus) * base) % modulus; 
} 
+8

你有一個stackoverflow – ouah 2013-03-06 18:51:07

回答

5

@ouah已經在評論中發佈了答案,所以如果他想發佈答案,我會刪除它。

你有堆棧溢出。你正在遞歸太多次,並且吹出你的堆棧空間。 C++並不保證tail調用優化(即使你沒有在最後的遞歸調用的返回值上執行該操作),所以你最好使用循環來實現它。

如果你想堅持遞歸路線,試着通過解釋here真正的尾遞歸,看看編譯器是否可以幫助你。

+0

我會接受這個,如果ouah今天沒有發佈答案。非常感謝。 – Richard 2013-03-06 19:05:02

+0

+1,@Richard我不會發表任何答案。 – ouah 2013-03-06 19:05:45

1

你的遞歸變得如此之深,它佔據了整個袋子。考慮使用while循環代替。

2

您正在創建一個巨大的遞歸鏈。你應該嘗試通過迭代來節省內存和處理。

unsigned modex(unsigned base, unsigned exponent, unsigned modulus){ 

    unsigned 
     result = 1; 

    while(expoent--){ 
     result *= base; 
     result %= modulus; 

    } 

    return result; 

} 

不過,你可以做得更快。

相關問題