汉诺塔问题
- 问题描述:
代码:
#include <stdio.h>
using namespace std;
void hanoi(char * start, char * mid, char * end, int n){
if (n==1) {
printf("%s %s\n", start, end); //递归出口,如果只有一个盘,则直接从start放置到end
}else{
hanoi(start, end, mid, n-1); //先借助end柱子,把n-1个盘子从start放置到mid柱子上
printf("%s %s\n", start, end); //然后把第n个盘子,从start柱子放置到end柱子上
hanoi(mid, start, end, n-1); //最后,把mid柱子上的n-1个盘子借助于start柱子放置到end柱子上
}
}
int main() {
hanoi("A", "B", "C", 3);
return 0;
}
运行结果:
A C
A B
C B
A C
B A
B C
A C
也就是说先从A柱子拿一个盘子放到C柱子上,然后再从A柱子拿一个盘子放到B柱子上,依次按照以上步骤就可以实现把A柱子上的盘子全部放置到C柱子上。
算法分析:
空间复杂度:
- 调试函数栈,可得空间复杂度为O(N)
时间复杂度:
- T(N) = 2T(N-1)+1,无法使用主定理:T(N) = a*T(N/b)+f(N) 只能使用归纳法或者放缩法