理解递归阶乘中的Java行为

时间:2016-11-03 23:27:12

标签: java recursion decrement

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

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编辑:不会返回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 * fact(n-1)是解决问题的更好方法。

有人可以帮我理解这个表达式的评价吗?谢谢!

1 个答案:

答案 0 :(得分:8)

这一切都归结为这些表达方式之间的区别:

line =  buffer.lines().collect(Collectors.joining());

return n * f(--n); return f(--n) * n; 时,这些表达式的评估如下:

n = 4

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

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

--

在相关的说明中,猜猜如何评估:

// 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; 运算符:在--中对n进行评估后,将应用-1减量。