Java 什么';在这个递归函数中发生了什么?

Java 什么';在这个递归函数中发生了什么?,java,recursion,Java,Recursion,我有一个递归阶乘函数: public class Driver{ public static void main (String args[]) { System.out.println(factorial(5)); } private static int factorial(int n) { int product; if (n <= 2){ product = n; return 2;} else{ product = n * f

我有一个递归阶乘函数:

public class Driver{
public static void main (String args[])
{

    System.out.println(factorial(5));

}

private static int factorial(int n)
{
    int product;
    if (n <= 2){ product = n; return 2;}
    else{
        product = n * factorial(n-1);
        System.out.println("current product =" + product);
        System.out.println("product = " + n + " * factorial(" + (n-1) + ")");
    }
    return product;
}
}

我想弄清楚这到底是怎么回事。我不明白n=2时它是如何开始打印的。那么当前的产品=6是从哪里来的呢?谢谢

n==2
是您的基本情况,因此第一个通过下一行的函数是
n-1==2
n==3
。这是因为您的输出是在递归调用之后执行的,所以它首先打印最深的调用(感谢Patricia Shanahan)。如果希望它从大到小打印,请将
println
行移到递归调用
factorial
的行上方

product = n * factorial(n-1);
同样

if (n <= 2){ product = n; return 2;}

如果(n
n==2
是您的基本情况,那么第一个通过下一行的函数是
n-1==2
n==3
。这是因为您的输出是在递归调用之后执行的,所以它首先打印最深的调用(感谢Patricia Shanahan)。如果希望它从大到小打印,请将
println
行移到递归调用
factorial
的行上方

product = n * factorial(n-1);
同样

if (n <= 2){ product = n; return 2;}

if(注意,输出是在递归调用之后完成的,所以前两行是从最深的激活中输出的。噢,糟糕,是的,我现在看到了错误,谢谢。你能解释一下你所说的“越过下面的行”是什么意思吗。谢谢!@papercuts如果可以的话,试着在调试器中运行它,这可能比我更有用。@KarthikT你能告诉我如何在eclipse中执行此操作吗?顺便说一句,我非常感谢你的帮助。@papercuts双击一行左侧的灰色区域以设置“断点”。现在,在对factorial的原始调用处设置一个断点,并使用绿色箭头“run”图标左侧的“Debug as”或bug图标运行应用程序。您可以在此之外进行探索。您应该使用“Step into”或“Step over”一次运行一个代码。它们出现在调试透视图中,您应该自动切换到该透视图。请注意,输出是在递归调用之后完成的,因此前两行是从最深的激活中输出的。哦,糟糕的是,我现在看到了错误。谢谢。您能解释一下您的意思吗“通过下面的一行”。谢谢!@papercuts如果可以的话,试着在调试器中运行它,这可能比我更有用。@KarthikT你能告诉我如何在eclipse中执行此操作吗?顺便说一句,我非常感谢你的帮助。@papercuts双击一行左侧的灰色区域以设置“断点”。现在在最初调用factorial时设置一个断点,并使用“Debug as”或绿色箭头“run”图标左侧的bug图标运行应用程序。您可以进一步探索。您应该使用“Step into”或“Step over”一次运行一个代码。它们出现在Debug透视图中,您应该自动切换到该透视图。