/*
Recursion 复杂度计算的关键 --> 找到边界
基本操作的时间均设为c
文字都在注释里聊--不好意思懒得写在word中。
T(n) 执行函数所要消耗的时间

*/

// 计算阶乘 普通递归
int func(int n) {
    if(!n) return 0; // 基本操作
    return n * func(n-1);
}
// 时间复杂度
// T(n) == c + T(n-1) == c + (c+T(n-2))
// ...    == cn + T(0) == c(n+1)
// 由化简规则舍去常数 ==> O(n)

// 空间复杂度
// 因为n*func(n-1)时func(n-1)还没有确定,所以需要空间保存这一个记录到func(n-1)确定为止
// 设每次保存所需空间为a
// ==> S(n) == a * 递归次数 == an
// 由化简规则舍去常数 ==> O(n)




int func(int n) {
    if(!n) return 1; // 基本操作
    return func(n-1) + func(n-1);
}
// T(n) == 2T(n-1) == 2(2T(n-2)) ...
//         == 2^n * T(0) == 2^n*c
// 由化简规则舍去常数 ==> O(2^n) 



int sum;
void func(int n) {
    if(!n) {
        sum += 1;  // 基本操作
        return; // 基本操作
    }else {
        for(int i=1; i<n; ++i) {
            func(n-1);
        }
    }return; // 基本操作
}
// O(n!) 时间复杂度
// T(n) == nT(n-1) == n(n-1)T(n-2)... == n! * c
// 由化简规则舍去常数 ==> O(n!)


int sum;
void func(int n) {
    if(n == 1) {
        sum += 1;
    }else {
        for(int i=1; i<n; i*=2) {
            func(n-1);
        }
    }return;
}
// 设k为操作次数,则在一次递归 2^k == n, k = logn
// 一次递归中调用了logn次下一层的函数,有如下的递推
// T(n) == log(n)T(n-1) == log(n) log(n-1) T(n-2) ...
// ==> O(?) 主要是分析的思想,怎么化简不会啊
02-12 15:34