当前位置: 首页 > 知识库问答 >
问题:

Leetcode中问题编号50的堆栈溢出错误

东方灵均
2023-03-14

对于下面的输入,我得到一个StackOverflow错误。你们能帮我解释一下吗,以及如何在我的代码中解决这个问题。

 System.out.println(myPow(0.00001,2147483647));  

 public static double myPow(double x, int n) {
         
        return helperPow(x,n,1);
        }


     
     private static double helperPow(double x, int n,double d) {
         if(n == 0) {
             return d;
         }
         
         if(n < 0) {
             return  helperPow(x,++n, d/x);
         }
         
         return helperPow(x, --n, d*x); 
         
     }

共有1个答案

梁丘柏
2023-03-14

使用您当前的方法,递归的层数将等于n,因此它肯定会导致StackOverflow异常,因为它需要相当大的堆栈空间。

请注意,如果n是偶数,x^n=(x^(n/2))*(x^(n/2))

如果n是奇数,x^n=(x^(n/2))*(x^(n/2))*x

因此,您可以将递归级别的数量减少到log(n),即使n很大,也绝对不会导致Stackoverflow异常(在您的情况下,n2147483647,需要31次递归):

    public double myPow(double x, int n) {
        return n >= 0 ? helperPow(x, n) : 1.0 / helperPow(x, -n);
    }
    public double helperPow(double x, long n) {
        if (n == 0) {
            return 1.0;
        }
        double y = helperPow(x, n / 2);
        return n % 2 == 0 ? y * y : y * y * x;
    }
 类似资料:
  • 问题内容: 下面给出的代码显示了运行时的Stackoverflow错误。但是,如果我使另一个类CarChange创建Car的对象,它将成功运行。我是一个初学者,请执行以下代码以了解在Java中进行向上转换的重要性。 问题答案: 一个stackoverflow通常意味着您有一个无限循环。 收到此消息的原因是因为您从testdrive方法调用驱动器,并且在该方法中再次调用drive。

  • 我有一个类 Delete 我想使用 Gson 库将其转换为 json,但是当我转换它时,它会抛出 这是我的类 这里是枚举类DeleteStatus.scala 删除原因.scala 以下是我如何在Json转换 但它抛出以下异常 请帮助其中的错误

  • 所以我们有一个迷宫,有墙(W ),开放路径(O ),起点点(S)和终点点(F)。 我正在尝试编写一种算法,将迷宫文件转换为二维点阵列,形成网格。 一旦我有了网格,我想从迷宫中的“S”字符开始,并尝试找到是否有可能穿过“O”到达“f”。(返回布尔值true/false) 我知道这个迷宫是可解的,为什么我会得到一个StackOverFlowError..? 以下是Maze1.txt文件: 这是我的代码

  • 我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码:

  • 我有一个文件解析器代码,偶尔会在m.matches()上出现堆栈溢出错误(其中m是匹配器)。 我再次运行我的应用程序,它解析相同的文件,没有堆栈溢出。 我的模式确实有点复杂。它基本上是一组可选的零长度正lookahead,其中包含命名组,这样我就可以匹配一组变量名/值对,而不考虑它们的顺序。但我认为,如果某个字符串会导致堆栈溢出错误,它总是会导致它。。。不只是有时候。。。有什么想法吗? 我的模式

  • 问题内容: 我正在运行一个用Java在Eclipse中编写的程序。对于很大的输入,该程序具有很深的递归级别。对于较小的输入,程序运行正常,但是在给出较大的输入时,出现以下错误: 可以通过增加Java堆栈大小来解决此问题,如果可以,那么如何在Eclipse中做到这一点? 更新: @乔恩·斯基特 该代码递归地遍历解析树以建立数据结构。因此,例如,代码将使用解析树中的一个节点来做一些工作,并在该节点的两