问题
我无法找到以下算法的时间复杂度:
void f2(int n) {
int i;
if (n == 1) {
return;
}
for (i = 0; i < n; i++) {
f2(n - 1);
}
}
我的问题
我找到的解决方案是O(2 ^ n),但正确的答案是O(n!),我不明白这是怎么可能的,如果有人能向我解释,我将非常感激。< / p>
答案 0 :(得分:2)
for (i = 0; i < n; i++) {
f2(n - 1);
}
所以外循环运行n次,并递归调用(n次)一个运行n-1次的内循环,直到达到1。
所以它可以n!
次运行。
答案 1 :(得分:0)
考虑以下功能
void fact(int n) {
int i;
if (n == 1) {
return;
}
for(int i=0; i<n; i++) {
fact(n-1);
}
}
假设n=2
;
功能变为
void fact(int n) {
fact(1);
fact(1);
}
似乎时间复杂度是指数级的。
现在假设n=4
void fact(int n) {
fact(3);
// -- this leads to fact(2) fact(2) fact(2)
// -- which leads to fact(1) fact(1) fact(1) fact(1) fact(1) fact1)
fact(3);
fact(3);
fact(3);
}
最终以O(n!)