递推方程
递推(Recurrence)
递归算法无法直接根据语句的执行次数计算出时间复杂度,但是可以通过递推方程迭代展开进行求解。
求和
C
int sum(int n) {
if (n <= 0) {
return 0;
}
return sum(n - 1) + n;
}知识测验
题目
递归求和满足
T(n) = T(n-1) + 1 且 T(0) = 1。展开到基本情况需要多少层?
插入排序
C
void insertion_sort(int arr[], int n) {
if (n <= 1) {
return;
}
insertion_sort(arr, n - 1);
int last = arr[n - 1];
int j = n - 2;
while (j >= 0 && arr[j] > last) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = last;
}知识测验
题目
递归插入排序最坏情况下满足
T(n) = T(n-1) + n。展开后新增工作量形成什么序列?
汉诺塔
有三根柱子 A、B、C,A 柱子上从下到上套有 个圆盘,要求将 A 柱子上的圆盘移动到 C 柱子上。每次只能移动一个圆盘,且大圆盘始终不能叠在小圆盘上面。
递归算法求解汉诺塔问题:
- 将前 个圆盘从 A 柱借助于 C 柱搬到 B 柱。
- 将最后一个圆盘直接从 A 柱搬到 C 柱。
- 将 个圆盘从 B 柱借助于 A 柱搬到 C 柱。
C
void hanoi(int n, char A, char B, char C) {
if (n == 1) {
move(1, A, C);
} else {
hanoi(n - 1, A, C, B);
move(n, A, C);
hanoi(n - 1, B, A, C);
}
}互动实验
挑战四层汉诺塔
访问权限免费
把四个圆盘从 A 柱搬到 C 柱。先点击来源柱,再点击目标柱;最优解需要 15 步。
步数:0 / 最优 15
知识测验
题目
汉诺塔递推式
T(n) = 2T(n-1) + 1 中的系数 2 表示什么?
假设每次移动花费 1 秒,解决一个 64 层的汉诺塔问题大约需要 5800 亿年。
动手练习
展开并求解递推方程
对下面三组递推方程使用迭代展开法。每题至少写出前两次展开、一般的第 k 次展开、终止条件和最终渐近复杂度。
T(0) = 1,T(n) = T(n-1) + 3。T(0) = 1,T(n) = T(n-1) + n。T(1) = 1,T(n) = 2T(n-1) + 2。