目录
M1. 非递归
//1.非递归
int f1(int n) {
if(n == 0)
return 0;
if(n == 1)
return 1;
int a = 0, b = 1, t;
for (int i = 0; i < n-1; ++i) { //注意此题这边是(n-1)
t = a + b;
a = b;
b = t;
}
return t;
}
int main(){
printf("%d",f1(4));
}
eg:
注:时间复杂度为O(n)
空间复杂度为O(1)
M2. 递归
//递归:因为解决这个问题的方法是一样的,所以可以不断地自身调用自身
int f2(int n){
if(n == 0)//递归的出口
return 0;
if(n == 1)//递归的出口
return 1;
return f2(n-1) + f2(n-2);
}
int main(){
printf("%d",f2(4));
}
eg:
注:时间复杂度为 O()
空间复杂度为O(n)
时间复杂度
递归的时间复杂度的计算就是要关注递归调用了多少次,下图所示。
假设一共有h层,不难发现,1到(h-1)层几乎处于一个比较满的状态,这个状态在循环次数上体现的是少了个常数,并不影响整个时间复杂度的计算。
了解了这个之后,开始计算递归的时间复杂度。假设一共有h层,那么一共进行了多少次递归呢?
第1层:
第2层:
第3层:
......
第(h-2)层:
第(h-1)层:
一共:+
+
+......+
=
*(1 -
)/(1-2)=
- 1
加上第h层的常数不改变时间复杂度
易知n = h
所时间复杂度为O()
空间复杂度
树高为h,n = h;
所以空间复杂度为 O(n)。