我是java的新手,对于一项任务,我们得到了一段错误的代码:
class Main {
// pre: assume n is greater or equal 0, but smaller than 100.
// post: return n! where n!=n*(n-1)! and 0!=1.
public static long fac(int n){
System.out.println(n);
long t = n*fac(n-1);
if (n < 0)
return 1;
return t;
}
//--------------------------------------------------------------------------
// this is the test code for the judge, do not modify
public static void main(String[] arg){
// test function
java.util.Scanner scanner = new java.util.Scanner(System.in);
while(scanner.hasNextInt()){
int input_integer=scanner.nextInt();
fac(input_integer);
}
scanner.close();
//---------------------------------------------------------------------------
}
我通过删除变量修复了堆栈溢出问题。
// pre: assume n is greater or equal 0, but smaller than 20.
// post: return n! where n!=n*(n-1)! and 0!=1.
public static long fac(int n){
System.out.println(n);
if (n <= 1)
return 1;
else return fac(n-1)*n;
}
例如,如果我输入4,它将给出4,3,2,1作为输出。当然,这不是我想要的实际输出。首先,我正在寻找的输出是相反的顺序,而实际的阶乘,而不仅仅是n。关于我做错了什么想法?
(作为示例输出:3 - > 1,1,2,6)
答案 0 :(得分:1)
只需在 后计算它就打印出来。
public static long fac(int n) {
long f = (n <= 1 ? 1 : fac(n - 1) * n);
System.out.println(f);
return f;
}
如果您在之前打印它,那么您将在爬上递归树时打印值。因此,值将以相反的顺序出现。 fac(
<强>名词强> =fac(
的 N-1 强> ...
。
如果您在之后打印它,那么当你走出递归树时,你将打印这些值。因此,值将按正向顺序显示。 fac(
的 1 强> *fac(
的 2 强> ...
。
答案 1 :(得分:0)
你的堆栈溢出不是因为你有一个变量,它是 因为您执行了递归调用 before 来检查 终止条件。
在递归调用之后打印结果,而不是递归调用之前的参数,将执行您想要的操作。
如果您坚持使用原始变量并使用if
声明,这就是它的样子:
public static long fac(int n){
if (n < 0)
return 1;
long t = n * fac(n-1);
System.out.println(t);
return t;
}