/* 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(?) 主要是分析的思想,怎么化简不会啊