gpt4 book ai didi

java - 了解递归阶乘中的 Java 行为

转载 作者:搜寻专家 更新时间:2023-11-01 01:40:57 26 4
gpt4 key购买 nike

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

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 * fact(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;

因为这里使用了后缀 -- 运算符:-1 减量将在 f(...)< 中的 n 求值后应用.

关于java - 了解递归阶乘中的 Java 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40412910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com