我有一个数字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;
}
它的时间复杂度是多少?谢谢。
答案 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次。