public class Main { static int count=1; public static int gzl(int a) { if(a%2!=0&&a!=1) { a=3*a+1; gzl(a); count+=1; } else if(a%2==0&&a!=1) { a=a/2; gzl(a); count+=1; } return(count); } public static void main(String[] args) { Scanner input=new Scanner(System.in); while(input.hasNext()) { int a=input.nextInt(); int b=input.nextInt(); int s2=0; if(a>b) { for(int i=b;i<=a-1;i++) { int s=gzl(i); count=1; int s1=gzl(i+1); count=1; if(s>=s1) { s2=s; } else { s2=s1; } } } if(a<b) { for(int i=a;i<=b-1;i++) { int s=gzl(i); count=1; int s1=gzl(i+1); count=1; if(s>=s1) { s2=s; } else { s2=s1; } } } System.out.println(s2); } } }优化这段代码
时间: 2023-12-01 22:04:23 浏览: 96
这段代码的主要问题是递归调用 gzl() 方法,并且每次递归都会重新计算 count,这样会导致代码效率低下。可以使用循环来替代递归,并且只需要在循环外部定义 count 变量。另外,可以使用一个数组来保存已经计算过的数的结果,避免重复计算。
下面是优化后的代码:
```
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
while(input.hasNext()) {
int a=input.nextInt();
int b=input.nextInt();
int[] res = new int[b+1];
int s2=0;
for(int i=a;i<=b;i++) {
int s=0, n=i;
while(n != 1) {
if(n <= b && res[n] != 0) {
s += res[n];
break;
}
if(n%2 == 0) {
n /= 2;
} else {
n = 3*n+1;
}
s++;
}
res[i] = s;
if(s > s2) {
s2 = s;
}
}
System.out.println(s2+1);
}
}
}
```
优化后的代码使用了循环来替代递归,并且只需要在循环外部定义 count 变量。另外,使用了一个数组 res 来保存已经计算过的数的结果,避免重复计算。同时,避免了使用大量的 if/else 语句。
阅读全文