如何使用递归将可视化打印为数字的阶乘
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);
}
我知道如何计算一个数的阶乘,但我想在方法调用自身时显示内存中发生的情况。所以使用递归的阶乘就像 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);
}