如何使用递归将可视化打印为数字的阶乘

How Can Print a Visualization to Factorial of a Number with Recursion

我知道如何计算一个数的阶乘,但我想在方法调用自身时显示内存中发生的情况。所以使用递归的阶乘就像 fallows

public static long factorial(int n) { 
    if (n == 1) return 1; 
    return n * factorial(n-1); 
} 

我想实现以下目标

factorial(5) 
   factorial(4) 
      factorial(3) 
         factorial(2) 
            factorial(1) 
               return 1 
            return 2*1 = 2 
         return 3*2 = 6 
      return 4*6 = 24 
   return 5*24 = 120

我已经到了这个地步...我无法显示方法的递归 return(第二部分)

public static long factorial(int n) {   
    System.out.println("factorial("+n+")");
    if (n == 1) {
        System.out.println("return 1");
        return 1; 
    }       
    return n * factorial(n-1);      
} 

您可以使用 try{}finally{} 块做一些事情"after"它已返回

public static long factorial(int n) {
    try {
        System.out.println("factorial(" + n + ")");
        if (n == 1) {
            System.out.println("return 1");
            return 1;
        }
        return n * factorial(n - 1);
    } finally {
        System.out.println("return " + n);
    }
}

先尝试打印 return:

public static long factorial(int n) {   
    System.out.println("factorial("+n+")");
    if (n <= 1) { // factorial(0) = factorial(1) = 1
        System.out.println("return 1");
        return 1; 
    }
    long fac = factorial(n-1);
    System.out.printf("return %d * %d = %d%n", n, fac, n * fac);
    return n * fac;      
} 

要获得每行的 n 个空格,您可以添加一个辅助函数,该函数接受递归的当前 "depth" 并相应地打印 n 个空格。

// public function visible to the world
public static long factorial(int n) {   
    return factorial(5, 0);
} 

// helper function that takes in the current depth of 
// the recursion
private static long factorial(int n, int depth) {
    String spaces = repeat(' ', depth);
    System.out.print(spaces);
    System.out.println("factorial("+n+")");
    if (n <= 1) { // factorial(0) = factorial(1) = 1
        System.out.println(spaces + " return 1");
        return 1; 
    }

    long fac = factorial(n-1, depth + 1);
    System.out.print(spaces);
    System.out.printf("return %d * %d = %d%n", n, fac, n * fac);
    return n * fac;      
}

// helper function to create a String by repeating
// char c, n times.
private static String repeat(char c, int times) {
    char[] sequence = new char[times];
    Arrays.fill(sequence, c);
    return new String(sequence);
}