面试题答案
一键面试#include <stdio.h>
// 递归函数解决汉诺塔问题
void hanoi(int n, char source, char auxiliary, char target) {
if (n > 0) {
// 将n - 1个圆盘从source移动到auxiliary
hanoi(n - 1, source, target, auxiliary);
// 将第n个圆盘从source移动到target
printf("Move disk %d from %c to %c\n", n, source, target);
// 将n - 1个圆盘从auxiliary移动到target
hanoi(n - 1, auxiliary, source, target);
}
}
int main() {
int n = 3; // 假设有3个圆盘
hanoi(n, 'A', 'B', 'C');
return 0;
}
时间复杂度分析
设移动 n
个圆盘所需的时间为 T(n)
。
- 第一步,将
n - 1
个圆盘从source
移动到auxiliary
,所需时间为T(n - 1)
。 - 第二步,将第
n
个圆盘从source
移动到target
,所需时间为常数时间,记为O(1)
。 - 第三步,将
n - 1
个圆盘从auxiliary
移动到target
,所需时间为T(n - 1)
。
因此,T(n) = 2T(n - 1) + O(1)
。
根据递归式求解,可得 T(n) = 2^n - 1
,所以汉诺塔递归算法的时间复杂度为 O(2^n)
。