我正在尝试解决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 );
}
}
}
答案 0 :(得分:0)
尽管问题陈述指出在一些未指定的数字中没有已知的数字,远远超过给定序列无法终止的1,000,000,但它没有谈论它们的任何循环长度。我想你会发现有些数字确实有很长的周期长度。
尽管您似乎很好地利用了memoization来避免冗余计算,但是递归地构造计算会使您面临溢出调用堆栈的风险,这可能需要一个仅几万的循环长度。此外,方法调用比简单分支要昂贵得多,因此您的递归方法也可能比迭代方法慢。