谁能向我解释为啥我会收到 Stack Overflow 错误?

Posted

技术标签:

【中文标题】谁能向我解释为啥我会收到 Stack Overflow 错误?【英文标题】:Can anybody explain to me why I am getting Stack Overflow Error?谁能向我解释为什么我会收到 Stack Overflow 错误? 【发布时间】:2014-01-09 17:57:12 【问题描述】:

我正在尝试完成Project Euler question 并尝试执行递归解决方案,但我收到堆栈溢出错误并且似乎无法弄清楚原因。

任何帮助都会很棒。

谢谢

public class Collatz 

public static void main(String[] args) 

    List<Integer> length = new ArrayList<Integer>();

    for(int i = 13; i < 1000000; i++)
        length.add(collat(i, 0));
    


public static int collat(int x, int c)

    if(x == 1)
        return c;
    

    if(x % 2 == 0)
        return collat(x/2, c + 1);
    else
        return collat((3 * x) + 1, c + 1);
    


【问题讨论】:

欧拉是哪个项目? 试试这里发布的解决方案***.com/questions/860550/… 您是否尝试过使用调试器查看错误发生时i 是什么? @HotLicks:该异常仅表示超出了固定堆栈大小。它并不表示存在无限递归。事实上,没有。对于这个 Project Euler 问题中的所有样本,已知 Collat​​z 序列是有限的。 @HotLicks:怎么没有无限递归这种东西?你觉得void foo(void) foo(); 是做什么的? 【参考方案1】:

Sean M. 是正确的;发生整数溢出。 That answer 应标记为已接受。

【讨论】:

对于这种问题当然迭代比较好,但是栈溢出还是个谜。根据en.wikipedia.org/wiki/Collatz_conjecture,“任何小于 1 亿的初始起始数字的最长级数是 63,728,127,有 949 个步骤”。这不应该溢出堆栈。 如果想实验性地增加栈空间可以设置-Xss,不过我原则上同意这个回复。 只是为了笑,插入一个深度计数器,看看你为解决方案做了多深。【参考方案2】:

您似乎遇到了整数溢出。我刚刚在您的 collat() 函数中添加了这个简单的检查。

if(x < 0) System.out.println("Overflow");

溢出发生在the sequence 中的第 121 步。使用更大的数据类型应该可以解决这个问题。

【讨论】:

【参考方案3】:

你需要长而不是整数

Project Euler Question 14 (Collatz Problem)

我建议的解决方案,使用 DP

public class Collatz 


public static void main(String[] args) 

    List<Long> length = new ArrayList<Long>();

    Map<Long,Long> dict = new HashMap<Long,Long>();

    for(int i = 13; i < 1000000; i++)
            length.add(collat(i, 0,dict));

    


public static long collat(long x, long c, Map<Long,Long> dict)


    if(dict.containsKey(x))
    
        return dict.get(x);
    

    if(x == 1)
        dict.put(x, c);
        return c;
    

    else
    
        if(x % 2 == 0)
            dict.put(x, collat(x/2, c + 1,dict));
            return dict.get(x);
            else
                dict.put(x,collat((3 * x) + 1, c + 1,dict));
                return dict.get(x);
            
        
    


【讨论】:

【参考方案4】:

因为您的默认堆栈大小已用完 128k? 增加堆栈大小可以解决此问题。

阅读:http://goo.gl/iy77Pr

【讨论】:

以上是关于谁能向我解释为啥我会收到 Stack Overflow 错误?的主要内容,如果未能解决你的问题,请参考以下文章

谁能向我解释这段代码?

谁能向我解释以下代码中的 java continue 语句执行?

谁能向我解释为什么b_list不打印c_list?

为啥项目数据这么大?

VL_PHOW 文档

React.JS Ref 中的 Ref 错误 - createRef、useRef 和 using Refs