Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解递归阶乘中的Java行为_Java_Recursion_Decrement - Fatal编程技术网

理解递归阶乘中的Java行为

理解递归阶乘中的Java行为,java,recursion,decrement,Java,Recursion,Decrement,我创建了两个递归方法来计算阶乘,如下所示: private int fact1(int n) { if (n == 0 || n == 1) return 1; return n * fact1(--n); } private int fact2(int n) { if (n == 0 || n == 1) return 1; return fact2(--n) * n; } 当我调用fact1(4)时,它返回24。当我调用f

我创建了两个递归方法来计算阶乘,如下所示:

private int fact1(int n) {
    if (n == 0 || n == 1)
        return 1;
    return n * fact1(--n);

}

private int fact2(int n) {
    if (n == 0 || n == 1)
        return 1;
    return fact2(--n) * n;
}
当我调用
fact1(4)
时,它返回
24
。当我调用
fact2(4)
时,它返回
6
EDIT:不是返回
18
,而是返回
6
)。我知道第二种方法是制作3*2*1,但我不明白为什么不制作4*3*2*1

如果我将返回更改为

//fact3(4) returns 60.
return (n + 1) * fact3(--n); // wrong
//fact4(4) returns 24
return fact4(--n) * (n + 1); // works
为什么该方法表现出这种行为

问题是关于不同的行为。我知道
n*事实(n-1)
是更好的解决方法


有人能帮我理解这个表达式的计算吗?谢谢

这一切都归结于这些表达式之间的差异:

return n * f(--n);

return f(--n) * n;
n=4
时,这些表达式的计算方式如下:

return 4 * f(3);

return f(3) * 3;
由于计算了
--n
的时刻,因此
n
的值减少1。 这就是前缀
--
操作符的工作方式

手动递归计算整个表达式可能会有所帮助。第一个:

// first
return 4 * f(3);
return 4 * 3 * f(2);
return 4 * 3 * 2 * f(1);
return 4 * 3 * 2 * 1;

// second
return f(3) * 3;
return f(2) * 2 * 3;
return f(1) * 1 * 2 * 3;
return 1 * 1 * 2 * 3;
在相关注释中,猜猜这将如何评估:

return f(n--) * n;
它将是:

return f(4) * 3;

因为这里使用了后缀
--
操作符:在第二行
f(…)

中对
n
求值后,将应用-1减量,当对
f(3)
求值时,行为是什么?为什么第二次调用返回
f(2)*3
?如果你的意思是
fact2(3)
,同样的逻辑适用于我的第二行,但是
n=3
,因此变成
f(2)*2
你是说表达式是(f(2)*2)*3吗?它返回6。但是在这里运行代码返回18。实际上,是的,你必须运行其他东西才能得到18,因为你发布的方法分别返回24和6,好的,我会检查。谢谢你的回答。奇怪的是,现在还没有人指出事实2(4)实际上是
6