【深基5.例3】冰雹猜想 - 洛谷https://www.luogu.com.cn/problem/P5727这种方法比较繁琐,预先定义固定的数组长度,很局限:
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int i=0;
int[] a=new int[1000000];
while(n!=1) {
a[i]=n;
i++;
if(n%2==1) {
n=n*3+1;
}else if(n%2==0) {
n=n/2;
}
}
a[i]=1;
for(int j=i;j>=0;j--) {
System.out.printf("%d"+" ",a[j]);
}
}
}
简化的方法如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
hailstone(n);
}
public static void hailstone(int n) {
if (n == 1) {
System.out.print(n);
} else {
hailstone((n % 2 == 0) ? n / 2 : n * 3 + 1);
System.out.print(" " + n);
}
}
}
这段代码首先读取了输入的整数 n
,然后调用名为 hailstone
的递归函数。如果当前数字 n
是 1,那么递归结束,直接输出 1;否则,根据当前数字是奇数还是偶数,递归调用 hailstone
函数。递归调用的顺序使得最终的输出是从最后的 1 开始的整个变化序列的倒序。
递归的终止条件是当输入的数字 `n` 等于 1 时,即 `n == 1`。在这种情况下,递归函数不再继续调用自身,而是直接输出当前的数字 1,结束递归。