实验内容:
分别计算 4阶/6阶汉诺塔问题,统计各自需要多少移动步数
问题分析:
可以把n个盘子抽象为两个盘子,上面“一个”由1~n-1号组成,下面的“一个”由n号盘子组成。问题就转化成先借助B将 1~n-1号盘子从A移动到C,然后将n号盘子从A移动到B,再将1~n-1号盘子借助A从C移动到B。
数学建模:
定义汉诺塔函数hannota(n,a,b,c) n为几层汉诺塔,a,b,c是盘子。
(1)第一步:hannota(n-1,a,c,b);
(2)第二步: n号盘子从a到b;
(3)第三步: hannota(n-1,c,b,a);
递归出口是n=0
实验代码:
#define _CRT_NO_SECURE_WARNINGS #include#include using namespace std; int i = 0; void hannota(int num,char a,char b,char c) { if (num == 0) { return; } else { hannota(num - 1, a, c, b); cout << "#" << i + 1 << ":" << num << "号盘子:" << a << "->" << b << endl; i++; hannota(num - 1, c, b, a); } return; } int main() { int num = 0; cout << "请输入汉诺塔层数:"; cin >> num; hannota(num,'A', 'B', 'C'); cout << "移动盘子次数:" << i << endl; system("pause"); return 0; }
实验结果:
四阶汉诺塔:
六阶汉诺塔:
时间复杂度:
n-1个盘子从A到C需要T(n-1)步,移动n号盘子需要1步,
n-1个盘子从C到B需要T(n-1)步。
则T(n)=2T(n-1)+1 时间复杂度为:



