我编写了以下简单函数来执行模幂运算。但是,当指数参数大于约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;
}
答案 0 :(得分:5)
@ouah已经在评论中发布了答案,所以如果他想发一个答案,我会删除它。
你有堆栈溢出。您正在递归太多次并且会浪费您的堆栈空间。 C ++不保证尾部调用优化(即使你最后没有对递归调用的返回值进行该操作),所以最好使用循环实现它。
如果你想坚持使用递归路由,可以尝试通过解释here使其真正的尾递归,看看编译器是否可以帮助你。
答案 1 :(得分:2)
您正在创建一个巨大的递归链。你应该尝试通过迭代来节省内存和处理。
unsigned modex(unsigned base, unsigned exponent, unsigned modulus){
unsigned
result = 1;
while(expoent--){
result *= base;
result %= modulus;
}
return result;
}
不过,你可以做得更快。
答案 2 :(得分:1)
你的递归变得如此之深以至于占据了整个麻袋。请考虑使用while循环。