阶乘的时间复杂性

时间:2014-12-20 20:23:38

标签: c time-complexity

我有一个数字n,让我们说n = 5.我计算了n!像这样:

1 * 2 * 3 * 4 * 5 = 1 * 2 * 3 * 20 = 1 * 2 * 60 = 1 * 120 = 120;

int factorial(int y){
    int z1 = 0;
    if (y != 0) goto L1;
    goto L7;
L1: z1 = equals(y);
    z1 = z1 - 1;
    if (z1 != 0) goto L5;
    goto L7;
L5: y = multiplication(y, z1);
L2: z1 = z1 - 1;
    if (z1 != 0) goto L3;
    goto E;
L3: y = multiplication(y, z1);
    z1 = z1 - 1;
    if (z1 != 0) goto L3;
    goto E;
E:  return y;
L7: return 1;
}

它的时间复杂度是多少?谢谢。

2 个答案:

答案 0 :(得分:1)

线性。您对标签和goto的混淆使用可直接转换为:

int factorial(int y){
    int z1 = 0;
    if (y == 0) return 1;

    z1 = equals(y);
    z1 = z1 - 1;
    if (z1 == 0) return 1;

    y = multiplication(y, z1);
    z1 = z1 - 1;
    if (z1 == 0) return y;

    do
    {
        y = multiplication(y, z1);
        z1 = z1 - 1;
    } while (z1 != 0)

    return y;
}

while循环将执行y - 2次,这与y的值呈线性关系。因此,函数的运行时是线性的。

但我认为这种线性代码更简单:

int factorial(int y) {
    // factorial(0) and factorial(1) are just 1
    if (y < 2) return 1;

    // Now just calculate y * (y - 1) * (y - 2) * ... * 4 * 3 * 2
    int f = y;
    while (--y > 1)
    {
        f *= y;
    }

    return f;
}

答案 1 :(得分:0)

int factorial(int n){
    if(n==1 || n==0)
       return 1;
    return n*(factorial(n-1));

}

该实现具有T(n)= O(n)。我认为你的实现也具有相同的复杂性,因为&#34; do while&#34;循环完成了n次。