如何编写阶乘函数?

时间:2016-05-06 19:20:16

标签: java

我想创建一个方法,查找从1到n的所有整数的乘积。这是我的代码,但它并没有真正做我想要的:

error: Invalid view engine (pug)-- are you sure it supports `consolidate`?

4 个答案:

答案 0 :(得分:3)

好吧,result初始化为0.然后,在循环中,将它乘以某个值并将结果设置为result。众所周知,任何乘以零的都是零。考虑将result初始化为1

int result = 1;

另外,你的乘法逻辑是错误的。为什么要乘以ni?只需将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
  • 要计算从1到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指出这一点!)