我正在做家庭作业,我已经筋疲力尽了.我是编程新手,这是我的第一个编程课.
这就是问题:
考虑Collatz.java中的以下递归函数,它与数论中一个着名的未解决问题有关,称为Collatz问题或3n 1问题.
public static void collatz(int n) {
StdOut.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< N为collatz(n)的递归调用次数最大化的N.提示:使用memoization.未解决的问题是没有人知道函数是否终止n的所有正值(数学归纳没有帮助,因为其中一个递归调用是参数的较大值). 我尝试过几个方面:使用for循环,尝试计算每次执行方法时变量递增的执行次数,以及数小时的苦差事. 显然,我应该以某种方式使用数组与memoization.但是,我不明白在启动时必须指定数组的长度时如何使用数组. 我做错了什么吗?我误解了这个问题吗? 到目前为止,这是我的代码.它反映了尝试创建整数数组的尝试:
public class Collatz2 {
public static int collatz2(int n)
{
StdOut.print(n + " ");
if (n==1) {return 1;}
else if (n==2) {return 1;}
else if (n%2==0) {return collatz2(n/2);}
else {return collatz2(3*n+1);}
}
public static void main(String[] args)
{
int N = Integer.parseInt(args[0]);
StdOut.println(collatz2(N));
}
}
编辑:
我写了一个单独的程序
public class Count {
public static void main(String[] args) {
int count = 0;
while (!StdIn.isEmpty()) {
int value = StdIn.readInt();
count++;
}
StdOut.println("count is " + count);
}
}
然后我使用了管道:%java Collatz2 6 | java计数
它运作得很好.