Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免java.lang.StackOverflower错误:null?_Java_Collatz - Fatal编程技术网

如何避免java.lang.StackOverflower错误:null?

如何避免java.lang.StackOverflower错误:null?,java,collatz,Java,Collatz,我正在努力自学一点Java 通常我有足够多的资源,像这样的好网站, 但现在我只想知道我错在哪里 因此,问题的措辞如下: 下面的迭代序列是为一组正函数定义的 整数: n→ n/2(n为偶数)n→ 3n+1(n为奇数) 使用上面的规则,从13开始,我们生成以下内容 顺序: 十三,→ 40→ 20→ 10→ 5.→ 16→ 8.→ 4.→ 2.→ 1可以看出 序列(从13开始到1结束)包含10个术语。 虽然它还没有被证明(科拉兹问题),但它被认为是 所有的起始数字都以1结束 哪一个起始数字,在一百万以

我正在努力自学一点Java 通常我有足够多的资源,像这样的好网站, 但现在我只想知道我错在哪里

因此,问题的措辞如下:

下面的迭代序列是为一组正函数定义的 整数:

n→ n/2(n为偶数)n→ 3n+1(n为奇数)

使用上面的规则,从13开始,我们生成以下内容 顺序:

十三,→ 40→ 20→ 10→ 5.→ 16→ 8.→ 4.→ 2.→ 1可以看出 序列(从13开始到1结束)包含10个术语。 虽然它还没有被证明(科拉兹问题),但它被认为是 所有的起始数字都以1结束

哪一个起始数字,在一百万以下,产生的链条最长

注意:一旦链开始,允许术语超过1 百万

我一直收到这些java.lang.StackOverflower错误,有人能帮我吗。 我的代码:

import java.util.HashMap;
公共类
{
哈希映射检查;
int结果;
公共图书馆()
{
check=newhashmap();
}
公共整数搜索(整数编号)
{
int startingNumber=数字;
while(check.get(number)==null&&number!=1){
如果(数字%2==0){
数量=数量/2;
结果=搜索(编号);
结果++;
}
否则{
数字=(3*数字)+1;
结果=搜索(编号);
结果++;
}
}
if(check.get(startingNumber)!=null){
结果=结果+检查。获取(编号);
检查。放置(起始编号、结果);
}
否则{
检查。放置(起始编号、结果);
}
返回结果;
}
公共int测试()
{
内部温度=0;
int最高=0;
int-get=0;
对于(int i=1000001;i>1;i--){
结果=0;
temp=搜索(i);
如果(温度>最高值){
最高=温度;
get=i;
}
系统输出打印LN(i);
}
返回获取;
}
}
编辑:

公共类
{
公共图书馆()
{
}
公共int快速搜索(int numb)
{
int步数=0;
while(麻木!=1){
如果(numb%2==0){
麻木/=2;
}
否则{
numb=3*numb+1;
}
steps++;
}
返回步骤;
}
公共int测试()
{
内部温度=0;
int最高=0;
int-get=0;
对于(int i=1;i最高){
最高=温度;
get=i;
}
系统输出打印LN(i);
}
返回获取;
}
}
编辑2: 所以在编辑版本代码中,我从机器中得到了一个冻结,但是当我将int改为long时,它工作得非常好,尽管我知道使用一些Map来存储值,您可以更快地找到它。谢谢大家

问题在于:

public int search(int number)
{

    int startingNumber = number;

    while (check.get(number)==null && number!=1){

        if (number%2==0){
            number = number / 2;
            result = search(number);
            result++;               
        }

        else {
            number = (3*number)+1;
            result = search(number);
            result++;
        }
    }

    if (check.get(startingNumber)!=null){
        result=result+check.get(number);
        check.put(startingNumber,result);

    }
    else{
        check.put(startingNumber,result);
    }

    return result;
}

递归调用search(int)会导致堆栈。

问题是,递归调用太多。最好的解决方法是使代码迭代。只需在过程中重新执行
循环,首先检查是否已找到该数字。如果是,则返回到达该数字所需的步骤和从该数字到
1所需的步骤之和。否则,只需更新下一步的编号,再次运行循环。同时,你只需要跟踪你到达一个已知号码所采取的步骤

就我个人而言,我会完全删除
HashMap
,只需要一个简单的
while
循环:

int步数=0;
while(数字!=1){
如果(编号%2==0)编号/=2;
其他编号=3*编号+1
steps++;
}
编辑:如果您想添加一个
HashMap
来存储找到的值,可以这样做(我假设您在前面定义了一个名为
foundNumbers
HashMap
):

公共整数搜索(长数字){
int步数=0;
长首字母数字=数字;
while(数字!=1){
如果(编号%2==0)编号/=2;
其他编号=3*编号+1
steps++;
if(foundnumber.containsKey(number)){
步骤+=FoundNumber.get(数字)
foundnumber.put(初始编号、步骤);
返回步骤;
}
}
foundnumber.put(初始编号、步骤);
返回步骤;
}

尽管递归代码在许多情况下都很简单紧凑,但存在堆栈溢出的可能性,特别是当递归链的长度未知时


您的案例很简单,可以通过迭代轻松解决。因此,尝试使用迭代模型而不是递归模型。

“我正在尝试学习javascript”-Java和javascript不是同一种语言。您的代码是javaMap为什么要使用hashmap来存储结果和结果的起始编号?从hashmap查找内容可能比将其乘以3再加1或除以1慢得多2@JonK别忘了在@Bálint中链接,我将它存储在一个hashmap中,因此当我已经遇到一个已经处理过的数字时,我会获取该值并加上+1,然后再存储它。或者这很愚蠢?使用调试器来找出答案。提示:您在没有终止条件的情况下重复出现。您的映射永远不会更新,因为您在更新映射之前无限递归。如果(数字%2==0){number=number/2;result=search(number);result++;}否则{number=(3*number)+1;result=search(number);result++;}问题可能在这里;)你是说像编辑的代码?但它在113381停了下来,不动了……我发现,这似乎是同样的练习。看看评论,它是
public class Euler
{
   public Euler()
    {
    }

    public int quickSearch(int numb)
    {
        int steps = 0;
        while (numb != 1) {
            if (numb % 2 == 0) {
                numb /= 2;
            }
            else {
                numb = 3 * numb + 1;
            }
            steps++;
        }
        return steps;
    }


    public int test()
    {
        int temp = 0;
        int highest=0;
        int get = 0;
        for (int i=1;i<1000001;i=i+2){

            temp = quickSearch(i);
            if(temp>highest){
                highest=temp;
                get = i;
            }
            System.out.println(i);

        }

        return get;
    }
}
public int search(int number)
{

    int startingNumber = number;

    while (check.get(number)==null && number!=1){

        if (number%2==0){
            number = number / 2;
            result = search(number);
            result++;               
        }

        else {
            number = (3*number)+1;
            result = search(number);
            result++;
        }
    }

    if (check.get(startingNumber)!=null){
        result=result+check.get(number);
        check.put(startingNumber,result);

    }
    else{
        check.put(startingNumber,result);
    }

    return result;
}