这个问题的措辞很差,但是如何在我使用递归时在运行时没有得到大约一百条错误消息的情况下使我的代码按需运行?这是我错误的程序
public class Collatz
{
public static int count;
public static int pluscount() {
return count++;
}
public static void collatz (int n)
{
if (n < count) {
System.out.print(n + "");
}
if (n == 1) return;
if (n % 2 == 0) {
pluscount();
collatz(n / 2);
}
else {
pluscount();
collatz(3*n + 1);
}
}
public static void main(String[] args)
{
int N = Integer.parseInt(args[0]);
int[] array = new int [N+1];
for (int i = 0; i <= N; i++) {
count = 0;
collatz(i);
array [i] = count;
}
int max = StdStats.max(array);
System.out.println(max);
}
}
如果我将collatz()方法更改为
public static void collatz (int n)
{
count ++;
StdOut.print(n + "");
if (n == 1 || n == 0) return;
if (n % 2 == 0) collatz(n / 2);
else
collatz(3*n + 1);
}
并从我的代码中删除pluscount(),并输入7作为参数,代码运行并打印01213105168421421516842163105168421722113417522613402010516842117
175226134020105168421
,但它应该打印7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
以下是我的Java教科书中的说明,如果有人不理解我想要完成的任务:
考虑以下递归函数,它与数论中一个着名的未解决问题有关,称为Collatz问题或3n + 1问题。
public static void collatz(int n) {
System.out.print(n + " ");
if (n == 1) return;
if (n % 2 == 0) collatz(n / 2);
else collatz(3*n + 1);
}
例如,对collatz(7)
的调用会打印序列
7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
是17个递归调用的结果。编写一个采用命令行参数N的程序,并返回n&lt; N为collatz(n)
的递归调用次数最大化的N.
答案 0 :(得分:0)
当您致电collatz(i)
并获得结果时,我不会将其保存到数组中。而只是跟踪你的最大数量和你的最大数量。这样的事情应该根据你要采取的方法做到:
public static int count;
public static void collatz(int n) {
count++;
//System.out.print(n + " ");
if (n == 1) return;
if (n % 2 == 0) collatz(n / 2);
else collatz(3*n + 1);
}
public static void main(String[] args)
{
int N = Integer.parseInt(args[0]);
int maxn = 0;
int maxCount = 0;
for (int i=1; i<=N; i++){ //Start at 1 since collatz(0) is infinite
count = 0;
collatz(i);
if (count>maxCount){
maxCount = count;
maxn = i;
}
}
System.out.println("your max n is: "+maxn);
}
另请注意,我在collatz
中注释了打印件的陈述。问题只关注正在进行多少次递归调用。在所有递归调用期间,我们并不关心输出是什么。
希望这会有所帮助。
答案 1 :(得分:0)
您的代码存在两个问题
1.主方法中的循环从0开始导致问题。从1开始迭代
for (int i = 1; i <= N; i++)
2.无需将if (n < count)
放入collatz方法