我想创建一个方法,查找从1到n的所有整数的乘积。这是我的代码,但它并没有真正做我想要的:
error: Invalid view engine (pug)-- are you sure it supports `consolidate`?
答案 0 :(得分:3)
好吧,result
初始化为0.然后,在循环中,将它乘以某个值并将结果设置为result
。众所周知,任何乘以零的都是零。考虑将result
初始化为1
int result = 1;
另外,你的乘法逻辑是错误的。为什么要乘以n
和i
?只需将result
乘以i
答案 1 :(得分:1)
递归在这里也很漂亮......
public int product(int someNum) {
if (someNum == 1) return 1;
return someNum * product(someNum-1);
}
三元格式:
public int product(int someNum) {
return (someNum == 1) ? 1 : someNum * product(someNum -1);
}
答案 2 :(得分:0)
你走了:
public class MathUtil
{
public int product(int n)
{
if (n < 3) return n; // no need to do any stuff if n is less then 3,
// since the result will be n...
int result = 1; // result must be here
for (int i = 2; i <= n; i++) // start from 2
{
result *= i; // don't need n here
// and you can make it shorter with *=
}
return result;
}
}
result
的注释;假设您使用n = 3
调用此方法。 result
将是6
,但是如果它的类变量将被设置为,那么当您使用n = 4
为此类的同一实例调用此方法时,{{1} }将被返回,146
将被设置。这就是为什么你需要使它变为方法变量,所以无论何时调用方法,无论该类的哪个实例都调用它result
。
另外,如果每次调用此方法时都将其设为类变量并设置为1
,如果两个线程在此类的同一实例上调用此方法,则仍会产生同步问题,因此请避免(即使你没有计划这样的事情发生,这是一个很好的做法)。
答案 3 :(得分:0)
...换句话说,n!
result
应该已初始化为1 result
不应该是字段,而是本地变量i * n
,只能i
n
的产品,验证n >= 1
像这样:
public int product(int n) {
if (n < 1) {
throw new IllegalArgumentException("n must be 1 or greater");
}
int result = 1;
for (int i = 2; i <= n; i++) {
result *= i;
}
return result;
}
请注意,n > 12
会快速溢出,或者如果您将返回类型更改为long
,则会n > 20
。 (感谢@FredK指出这一点!)