我创建了两个递归方法来计算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)
是解决问题的更好方法。
有人可以帮我理解这个表达式的评价吗?谢谢!
答案 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减量。