理解递归阶乘中的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
。