[问题] leetcode POW(n,x) stack overflow

楼主: anoymouse (没有暱称)   2020-09-30 10:48:40
平台: Leetcode in C
Implement pow(x, n), which calculates x raised to the power n (i.e. xn).
在case myPow(0.00001,2147483647) 出现stack overflow的情况,
其实第二个参数不到INT_MAX就会overflow了。 请问是不是递回太深的缘故,要怎么保证不会overflow?
谢谢
double myPow(double x, int n){
double output;
if(n>0)
{
if(n == 1 )
return x;
else
{
output = x*myPow(x,n-1);
}
}
else if(n == 0 )
return 1;
else
{
if(n == -1)
return 1/x;
else
output = (1/x)*myPow(x,n+1);
}
return output;
}
作者: xiefengan (安)   2020-09-30 12:19:00
Google 快速幂
作者: s90104123 (也许当时忙着微笑和哭泣)   2020-09-30 16:36:00
INT_MAX看看?
作者: yangerma (walkhorse)   2020-09-30 19:25:00
你这边提到了两种overflow,我还不确定你是不是把两种搞混了。"stack overflow"就像你说的可能是递回过深的关系,至于多深叫过深跟runtime的系统设定、还有你的递回函数会吃多少内存有关。至于递回为什么不能过深,跟递回在执行时是如何做到的有关,不知道的话值得去了解一下。另外你提到的跟INT_MAX有关的是整数的overflow,因为C语言里int只能表达某个大小范围内的整数,如果在拿int运算的过程中超过那个范围,导致运算的结果不如预期。以上两种overflow完全是两回事,而这份程式码看起来很可能是发生了第一种(stack overflow)。你可以数数看这个程式应该会递回几层,以后就会知道这样的深度是会导致stack overflow的。至于解决方法,最简单的就是不要用递回ww
作者: alan23273850   2020-09-30 19:51:00
能用循环就不要用递回
作者: WPC001 (好闷, 迷惘~~)   2020-09-30 22:58:00
你这个为什么一定要用递回?
作者: kingofsdtw (不能閒下來!!)   2020-10-06 18:31:00
别用recursive看看? recursive考试用而已现实上一堆会变成地雷

Links booklink

Contact Us: admin [ a t ] ucptt.com