数据结构 3.4栈与递归(汉诺塔)
- 格式:ppt
- 大小:2.16 MB
- 文档页数:23


汉诺塔递归的过程
汉诺塔递归的过程可以分为以下几个步骤:
1. 基本情况:如果只有一个盘子需要移动,直接将这个盘子从起始柱子移动到目标柱子即可。
2. 递归步骤:将上面的 n-1 个盘子从起始柱子通过辅助柱子移动到目标柱子,然后将剩下的最大的盘子直接从起始柱子移动到目标柱子,最后,将之前移动到辅助柱子的 n-1 个盘子通过起始柱子移动到目标柱子。
递归的过程中,每一次移动实际上都是在解决一个更小的汉诺塔问题。具体来说,每当你移动一个盘子时,你实际上是在解决一个有 n-1 个盘子的汉诺塔问题,直到只剩下一个盘子,然后再反向操作。
例如,假设有三个盘子(A、B、C),汉诺塔的解法如下:
- 将 A(最小盘子)从 A 移动到 C(辅助柱子)。
- 将 B(中等盘子)从 A 移动到 A(起始柱子)。
- 将 A 从 C 移动到 B(目标柱子)。
- 将 B 从 A 移动到 C。
- 将 A 从 C 移动到 A。
- 将 B 从 C 移动到 B。
- 最后,将 A 从 A 移动到 B。 在这个过程中,每次移动都是在解决一个更小的问题,直到最终解决整个汉诺塔问题。
计算机科学与工程学院
《算法与数据结构》试验报告[三]
专业班级 10级计算机工程01 试验地点 计算机大楼计工专业机房403
学生学号 1 指导教师 蔡琼
学生姓名 晏佳益 试验时间 2012-4-14
试验项目 算法与数据结构
试验类别 基础性() 设计性() 综合性(√) 其它( )
试验目的及要求 (1)掌握栈的特点及其存储方法;
(2)掌握栈的常见算法以及程序实现;
(3)了解递归的工作过程。
成 绩 评 定 表
类 别 评 分 标 准 分值 得分 合 计
上机表现 积极出勤、遵守纪律
主动完成设计任务 30分
程序与报告 程序代码规范、功能正确
报告详实完整、体现收获 70分
备注:
评阅教师:
日 期: 年 月 日 计算机科学与工程学院
《算法与数据结构》试验报告 2 试 验 内 容
一、实验目的和要求
1、实验目的:
(1)掌握栈的特点及其存储方法;
(2)掌握栈的常见算法以及程序实现;
(3)了解递归的工作过程。
2、实验内容
Hanoi塔问题。(要求4个盘子移动,输出中间结果)
3、实验要求:用栈与递归函数实现。
二、设计分析
该问题涉及到递归调用问题,同时要求运用栈的知识。
对于栈的递归调用,已经有经典函数,只需记住就行。
而对于栈的运用,主要是其基本操作:栈的建立,初始化,进栈,出栈,显示栈内元素,以及销毁栈。对于某个盘子从“A->B”:表示从A出栈,进栈到B;
同时,要注意的是输入报错机制。
三、源程序代码
#include
#include
using namespace std;
typedef int ElementType;
#define MaxSize 4
typedef struct
{
ElementType data[MaxSize];
c语言递归函数实现汉诺塔
汉诺塔问题是一个经典的递归问题,它可以用来展示递归的思想和实现。在这个问题中,我们有三根柱子和一些圆盘,圆盘在柱子上,每个圆盘的大小不同,较小的在较大的上面。目标是将所有的圆盘从一个柱子移动到另一个柱子上,同时遵守以下几个规则:
1.每次只能移动一个圆盘;
2.每次移动时,圆盘都必须放置在更大的圆盘上;
3.圆盘只能从最上面移动;
4.可以利用剩余的柱子作为辅助。
这个问题可以使用递归算法来解决,下面我们来看一下如何在C语言中实现。
首先,我们需要定义一个递归函数来解决汉诺塔问题。这个函数将接受四个参数:圆盘数量n,起始柱子源(source),辅助柱子auxiliary和目标柱子destination。函数的目标是将n个圆盘从源柱子移动到目标柱子上。 ```c
void hanoi(int n, char source, char auxiliary, char
destination) {
//终止条件:当只有一个圆盘时,直接将它从源柱子移到目标柱子上
if (n == 1) {
printf("将圆盘从%c移动到%c\n", source, destination);
return;
}
//递归步骤:将n-1个圆盘从源柱子移动到辅助柱子上
hanoi(n-1, source, destination, auxiliary);
//将第n个圆盘从源柱子移动到目标柱子上
printf("将圆盘从%c移动到%c\n", source, destination);
//将n-1个圆盘从辅助柱子移动到目标柱子上
hanoi(n-1, auxiliary, source, destination); }
```
在这个递归函数中,当n等于1时,表示只剩下一个圆盘,此时直接将其从源柱子移动到目标柱子上。否则,我们首先递归地将n-1个圆盘从源柱子移动到辅助柱子上,然后将第n个圆盘从源柱子移动到目标柱子上,最后再将n-1个圆盘从辅助柱子移动到目标柱子上。
汉诺塔问题算法
汉诺塔问题是一个经典的数学问题和递归算法问题。在汉诺塔问题中,有三个柱子,分别称为A、B、C,有一组大小不同的圆盘,开始时,这些圆盘都堆叠在A柱子上,目标是将所有的圆盘从A柱子移动到C柱子上,期间可以借助B柱子。
以下是汉诺塔问题的算法实现:
1.如果只有一个圆盘,直接将其移动到C柱子上。
2.如果有多个圆盘(n个),先将上面的n1个圆盘从A柱子移动到B柱子上。
a.将上面的n1个圆盘从A柱子移动到C柱子,此时B柱子作为辅助柱子。
b.将最下面的第n个圆盘从A柱子移动到C柱子。
3.最后将B柱子作为起始柱子,A柱子作为辅助柱子,将B柱子上的n1个圆盘移动到C柱子上。
实现递归函数hanoi(n,start,aux,end):
如果n=1,直接将start柱子上的圆盘移动到end柱子上。
否则,将上面的n1个圆盘从start柱子移动到aux柱子。
调用递归函数hanoi(n1,start,end,aux),将start柱子上的n1个圆盘移动到aux柱子上。 将第n个圆盘从start柱子移动到end柱子上。
调用递归函数hanoi(n1,aux,start,end),将aux柱子上的n1个圆盘移动到end柱子上。
调用递归函数hanoi(n,'A','B','C')可以解决汉诺塔问题,其中n表示圆盘的数量,'A'、'B'、'C'表示三个柱子。
以上是汉诺塔问题的基本算法。通过递归调用,可以有效地解决汉诺塔问题,但是当圆盘数量较大时,计算量会变得非常大。因此,在实际应用中需要考虑到算法的优化和效率问题。