【问题标题】:What's going on inside of this recursive function?这个递归函数内部发生了什么?
【发布时间】:2013-03-07 11:10:04
【问题描述】:

我有这个递归阶乘函数:

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;
}
}

它打印以下内容:

current product =6
product = 3 * factorial(2)
current product =24
product = 4 * factorial(3)
current product =120
product = 5 * factorial(4)
120

我正试图弄清楚这里到底发生了什么。我不明白它是如何开始打印 n = 2 的。当前产品 = 6 是从哪里来的?谢谢!

【问题讨论】:

    标签: java recursion


    【解决方案1】:

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

    product = n * factorial(n-1);
    

    还有

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

    由于很多原因,这是错误的..

    应该是

    if (n <= 1){ return 1;}
    

    如果您无法理解这一点,请记住每个阶乘调用都独立于其他调用

    【讨论】:

    • 请注意,输出是在递归调用之后完成的,因此前两行来自执行输出的最深激活。
    • 哦,糟糕,我现在看到错误了,谢谢。你能解释一下“越过下面的线”是什么意思吗?谢谢!
    • @papercuts 如果可以的话,尝试在调试器中运行它,这可能会比我有更好的帮助。
    • @KarthikT 你能告诉我如何在 Eclipse 中做到这一点吗?我真的很感谢你的帮助。
    • @papercuts 双击一行左侧的灰色区域设置“断点”。现在在对阶乘的原始调用处设置一个断点,并使用“Debug as”或绿色箭头“Run”图标左侧的错误图标运行应用程序。你可以探索更多。您应该使用“Step into”或“Step over”一次运行一个代码。它们出现在调试透视图中,您应该自动切换到该透视图。
    猜你喜欢
    • 2020-03-12
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多