分治与减治算法实验:题目3 汉诺塔问题的程序设计

实验时间

2024年 4 月10日19时至22时

学时数

3

1.实验名称

分治与减治算法实验:题目3 汉诺塔问题的程序设计

2.实验目的

(1)掌握递归的有关概念;

(2)掌握汉诺塔问题的具体求解过程;

(3)在掌握的基础上编程实现汉诺塔的具体实现过程。

3.实验内容

在A上有按大小排序好的n个金碟,借助B的帮助,将A上的碟子移动到C上,在移动的过程中要严格按照大小顺序,不能将碟子放在比它小的上面,输出结果,输出时要求有文字说明。请任选一种语言编写程序实现上述算法,并分析其算法复杂度。

  1. 实验原理

递归(recursion)就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。递归必须具备以下两个基本要素,才能在有限次计算后得出结果。

(1)边界条件:确定递归到何时终止,也称为递归出口。

(2)递归模式:大问题是如何分解为小问题的,也称为递归体。

由于递归程序比较简洁,而且调用函数和被调用函数是同一个函数,很多人费解甚至怀疑这样简洁的语句是如何实现问题求解的。只有深刻理解了递归函数的运行过程,才能真正理解递归技术,从而设计递归程序。采用图示方法描述递归函数的执行过程,从甲可较直观地了解到递归函数的执行情况,具体方法如下:

(1)顺序写出函数执行的各语句,并用有向弧表示语句的执行次序;

(2)对函数的每个递归调用,写出对应的函数调用,从调用处画一条有向弧指向被调用函数入口,表示调用路线,从被调用函数末尾处画一条有向弧指向调用语句的下面,表示返回路线;

(3)在返回路线上标出本次调用所得的函数值。

当n=3时汉诺塔算法的执行过程如图4.18所示,实线表示深一层递归,虚线表示调用返回,有向弧上的数字表示递归调用和返回的执行顺序。

                     

9.实验源代码

汉诺塔问题的求解是一个典型的递归求解过程,具体算法如下:

#include <iostream>

using namespace std;

void Hanoi(int n, char A, char B, char C) {

if (n == 1)

cout << A << "-->" << C << endl; //将碟子从A移到c上,递归结束

else {

Hanoi(n - 1, A, C, B); //将n-1个碟子从A借助c移到B上

cout << A << "-->" << C << endl; //将碟子从A移到C上

Hanoi(n - 1, B, A, C); //将n=1个碟子从B借助A移到c上

}

}

int main() {

int n;

char A, B, C;

cout << "此为汉诺塔问题,请输入碟子的个数:";

cin >> n;

cout << "请这样放置碟子:" << endl;

Hanoi(n, 'A', 'B', 'C');

}

时间复杂度为O(n2)

  1. 实验结论及心得

代码运行截图:

心得:

进一步熟悉递归。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值