我当时正在通过Euler项目,遇到了一个组合问题。组合逻辑意味着计算阶乘。因此,我决定创建一个阶乘方法。然后我遇到了一个问题-因为我可以很容易地同时使用迭代和递归来执行此操作,所以我应该选择哪一个?我很快写了2种方法-迭代:

public static long factorial(int num) {
        long result = 1;
        if(num == 0) {
            return 1;
        }
        else {
            for(int i = 2; i <= num; i++) {
                result *= i;
            }
            return result;
        }

和递归:
public static long factorial(int num) {
        if(num == 0) {
            return 1;
        }
        else {
            return num * factorial(num - 1);
        }
    }

如果我(显然)在这里谈论速度和功能,我应该使用哪一个?而且,总的来说,其中一种技术是否比另一种更好(因此,如果以后再遇到这种选择,我应该怎么做)?

最佳答案

两者都是无可救药的天真。没有认真应用阶乘将使用任何一个。我认为对于大n来说,两者都是无效的,并且当参数很大时,intlong都不够。

更好的方法是使用良好的gamma function实现和备忘录。

Here's是Robert Sedgewick的实现。

较大的值将需要对数。

10-06 04:36
查看更多