在java

时间:2015-10-11 20:59:54

标签: java collatz

我正在尝试解决java中的3n + 1问题。 UVA显示我的代码的运行时错误。我正在尝试第一次解决问题而我无法弄清楚问题。我使用网站上给出的输入进行了测试,并且它可以工作。它被拒绝了,因为我的代码运行缓慢吗?如果是这样,它如何优化?

PFB我的代码

import java.util.*;

class solution {


public static int[] clength = new int[1000000];

public static long nextnum(long n)
{

    if(n%2==0)
    {
        return n/2;
    }
    else
        return 3*n+1;
}

public static long cyclelength(long n)
{

    if(n==1)
    {
        return 1;

    }
    if (n < 1000000 && clength[(int)n] != 0)
    {
        return clength[(int)n];

    }
    long length= (1+ cyclelength(nextnum(n)));
    if (n < 1000000)
        clength[(int)n] = (int) length;

    return length;
}

public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    Scanner in = new Scanner(System.in);

    while(in.hasNext())
    {
        int a=in.nextInt();
        int b=in.nextInt();
        int min=Math.min(a, b);
        int max=Math.max(a, b);
        int count=0;

        for(int n=min;n<=max;n++)
        {
            count=(int) Math.max(count,cyclelength(n));

        }
        System.out.println(a + " " + b +" " +count );
    }
}

}

1 个答案:

答案 0 :(得分:0)

尽管问题陈述指出在一些未指定的数字中没有已知的数字,远远超过给定序列无法终止的1,000,000,但它没有谈论它们的任何循环长度。我想你会发现有些数字确实有很长的周期长度。

尽管您似乎很好地利用了memoization来避免冗余计算,但是递归地构造计算会使您面临溢出调用堆栈的风险,这可能需要一个仅几万的循环长度。此外,方法调用比简单分支要昂贵得多,因此您的递归方法也可能比迭代方法慢。