使用Java中的递归反向打印阶乘

时间:2015-04-09 14:44:15

标签: java recursion factorial

我是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)

2 个答案:

答案 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)

  1. 你的堆栈溢出不是因为你有一个变量,它是 因为您执行了递归调用 before 来检查 终止条件。

  2. 在递归调用之后打印结果,而不是递归调用之前的参数,将执行您想要的操作。

  3. 如果您坚持使用原始变量并使用if声明,这就是它的样子:

    public static long fac(int n){
      if (n < 0) 
        return 1;       
      long t = n * fac(n-1);                
      System.out.println(t);
      return t;
    }