实验内容:
分别计算 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<stdio.h>
#include<iostream>
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 时间复杂度为: