数据结构-n阶Hanoi塔问题作业_孙志佳(017)_计算机科学与技术6

合集下载

第7章汉诺Hanoi塔问题

第7章汉诺Hanoi塔问题

19
第7章 利用函数实现模块化程序设计
将3个盘子从A移到C的全过程
将2个盘子从A移到B
A
B
C
地球物理与信息工程学院计算机系
20
第7章 利用函数实现模块化程序设计
将3个盘子从A移到C的全过程
将1个盘子从A移到C
A
B
C
地球物理与信息工程学院计算机系
21
第7章 利用函数实现模块化程序设计
将3个盘子从A移到C的全过程
第1个和尚的做法
将1个从A到C
……
A
地球物理与信息工程学院计算机系
B
C
9
第7章 利用函数实现模块化程序设计
第1个和尚的做法
将63个从B到C
……
A
地球物理与信息工程学院计算机系
B
C
10
第7章 利用函数实现模块化程序设计
第1个和尚的做法
将63个从B到C
……
A
地球物理与信息工程学院计算机系
B
C
11
第7章 利用函数实现模块化程序设计
地球物理与信息工程学院计算机系
2
第7章 利用函数实现模块化程序设计
A
B
C
地球物理与信息工程学院计算机系
3
第7章 利用函数实现模块化程序设计
解题思路: 要把64个盘子从A座移动到C座,需要移动大约 264 次盘子。一般人是不可能直接确定移动盘子的 每一个具体步骤的 老和尚会这样想:假如有另外一个和尚能有办法 将上面63个盘子从一个座移到另一座。那么,问 题就解决了。此时老和尚只需这样做:
C语言程序设计
第7章 利用函数实现模块化程序设计
Hanoi(汉诺)塔问题

Hanoi塔问题Hanoi塔问题...

Hanoi塔问题Hanoi塔问题...
29
PARTITION过程
以 2 8 7 1 以 6 10 13 5 3 8 5 3 6 2 4 为例 11为例
PARTITION(A, p, r) x←A[r] i←p-1 for j ← p to r-1 do if A[j] ≤ x then i ← i+ 1 exchange A[i] ↔A[j] exchange A[i+1] ↔A[r] return i+1
10
递归举例-汉诺(Hanoi)塔问题
汉诺(Hanoi)塔问题分析
n=1时,直接a->b即可 n>1时,借助c实现移动,可先将n-1个圆盘按照规 则a->c,再将大圆盘a->b,最后将n-1个圆盘c->b 可以通过递归实现
伪码: hanoi(int n,int a,int b,int c) { if(n>0){hanoi(n-1,a,c,b); move(a,b); hanoi(n-1,c,b,a)} }
logb a −
b b b
logb a
)
19
主方法的应用
请注意,上述三种情况没有覆盖所有的f(n) 在应用时需要注意是否符合这三种情况 T(n) = 4T(n/2) + n T(n) = 4T(n/2) + n2 T(n) = 4T(n/2) + n3 T(n) = 4T(n/2) + n2/lgn T(n) = 2T(n/2) + nlgn
20
分治法
分治法的基本策略
分解(Divide):将原问题分解为子问题 解决(Conquer):求解子问题 合并(Combine):组合子问题的解得到原问题的 解
21
分治法的适用条件

Hanoi塔问题的解模型

Hanoi塔问题的解模型
收稿日期: 硕士生, 主研领域: 信息系统, 算 2003 - 05 - 26。谭罗生, 法设计及应用。
2 汉诺塔问题模型
2.1 汉诺塔问题描述
设有 A、 这些圆 B、 C 三个塔座。初始时, A 塔上有 n 个圆盘, 盘自下而上, 由大到小叠在一起, 并依次编号为 l, …, 2, n。现 要求将塔座 A 上的这一叠圆盘移到塔座 C 上, 并仍按同样顺序 叠置。并在移动圆盘时须遵守以下规则。 规则 1 规则 2 之上; 在满足规则 l、 可将圆盘移至 A, 2 的前提下, B, C 中任一塔座上。 规则 3 每次只能移动一个圆盘; 任何时刻都不允许将较大的圆盘压在较小的圆盘
南昌 330027)
摘 要 本文给出了汉诺 (Hanoi) 塔问题的一种新的解模型。通过这个模型, 完全找出了每一个圆盘的移动规律, 从而得到一个 与该问题传统的递归解在圆盘移动上完全一样, 但效率更高, 占用额外存储空间为零的非递归算法。 关键词 解模型 递归 非递归
A RESOLUTION MODEL OF THE TOWER-OF-HANOI PUZZLE
Tan Luoshengl Wu Fuying2 Huang Minghe2
1 2 ( The People s Bank of China Nanchang Central Subbranch ,Nanchang 330008 ) ( Department of Software , Jiangxi Normal Uniuersity , Nanchang 330027 )
k-I +
+I
这样就满足了汉 诺 塔 游 戏 规 则。
பைடு நூலகம்
、 A2
k-I
是第 k 层上的相邻两结点, 按满 的 双 亲 结 点, 再访问

数据结构与算法(Python版)《数据结构》参考答案(A卷)

数据结构与算法(Python版)《数据结构》参考答案(A卷)

数据结构与算法(Python版)《数据结构》参考答案(A卷)引言概述:数据结构与算法是计算机科学中非常重要的基础知识,对于程序员来说,掌握好数据结构与算法对于编写高效、可靠的程序至关重要。

本文将以Python语言为基础,介绍《数据结构》参考答案(A卷)。

一、基础概念1.1 数据结构的定义与分类- 数据结构是指数据元素之间的关系和组织方式,常见的数据结构包括数组、链表、栈、队列、树、图等。

- 数据结构可分为线性结构和非线性结构,线性结构包括线性表、栈、队列等,非线性结构包括树、图等。

1.2 算法的概念与特性- 算法是解决特定问题的一系列步骤,它具有输入、输出、有穷性、确定性和可行性等特性。

- 算法的效率通常用时间复杂度和空间复杂度来衡量,时间复杂度表示算法执行所需的时间,空间复杂度表示算法执行所需的额外空间。

1.3 Python语言的特点与应用- Python是一种简洁、易读、易学的高级编程语言,它支持面向对象编程和函数式编程。

- Python在数据结构与算法领域有广泛的应用,它提供了丰富的内置数据结构和算法库,如列表、字典、集合、排序算法等。

二、常用数据结构2.1 数组- 数组是一种线性结构,它由相同类型的元素组成,通过索引来访问和操作元素。

- Python中的列表就是一种动态数组,它支持插入、删除、查找等操作,时间复杂度为O(1)。

2.2 链表- 链表也是一种线性结构,它由节点组成,每个节点包含数据和指向下一个节点的指针。

- Python中可以使用自定义类来实现链表,它支持插入、删除、查找等操作,时间复杂度为O(n)。

2.3 栈与队列- 栈是一种先进后出的数据结构,可以使用列表或者自定义类来实现。

- 队列是一种先进先出的数据结构,也可以使用列表或者自定义类来实现。

三、常用算法3.1 排序算法- 排序算法是对一组数据按照某种规则进行排序的算法,常见的排序算法有冒泡排序、插入排序、选择排序、快速排序等。

数据结构习题课6

数据结构习题课6
数据结构习题第6章
吉林大学计算机科学与技术学院 谷方明
6-1


递归函数F(n)=F(n-1)+n+1(n>1)的递归终止条 件是 . [A] F(0)=0 [B] F(1)=1 [C] F(0)=1 [D] F(n)=n
参考答案

B
6-2

函数F(x, y)定义为
F ( x 1, y) F ( x, y 1) F ( x, y) x y 如果x 0且y 0 否则
(0,z)
(0, y) (0,x)
(0,z)
(0, y) (0,x)
(0,2)
(0, y) (0,x) (0,3) (0,x) (0,4)
一种错误的做法
非递归算法 int Ack(int m,int n) { for(int i=0;i<=n;i++) a[0][i]=i+1; for(i=1;i<=m;i++){ a[i][0]=a[i-1][1]; for(j=1;j<=m;j++) a[i][j]=a[i-1][a[i][j-1]]; } return a[m][n]; }



【分级提示】 (1)此递归函数返回x的n次方值。要计算x的 n次方值,可以首先递归计算x的n-1次方值, 然后再将所的结果与x相乘。当n的值为0时, 返回值为1,递归终止; (2)执行pow(2,5)的结果是32,pow(2,5)执 行过程中发生了5次递归调用; (3)执行pow(x,n)最多发生了n次递归调用。

F(2, 1)的值是 [A ] 1 [C ] 3
. [B] 2 [D] 4

数据结构与算法(Python版)《数据结构》参考答案(A卷)

数据结构与算法(Python版)《数据结构》参考答案(A卷)

数据结构与算法(Python版)《数据结构》参考答案(A卷)引言概述:数据结构与算法是计算机科学中非常重要的一门课程,它涉及到如何组织和存储数据以及如何高效地解决问题。

本文将以Python语言为基础,介绍《数据结构》参考答案(A卷)的内容,主要包括数组、链表、栈、队列和树这五个部分。

一、数组1.1 数组的定义和特点- 数组是一种线性数据结构,它由一系列相同类型的元素组成。

- 数组的元素可以通过下标来访问,下标从0开始计数。

- 数组的长度是固定的,一旦创建后就不能改变。

1.2 数组的基本操作- 插入:在指定位置插入一个元素,其他元素依次后移。

- 删除:删除指定位置的元素,其他元素依次前移。

- 查找:根据下标查找指定位置的元素。

- 更新:根据下标修改指定位置的元素。

1.3 数组的应用场景- 数组常用于存储和处理一组相同类型的数据。

- 在算法中,数组可以用来表示矩阵、图等复杂的数据结构。

二、链表2.1 链表的定义和特点- 链表是一种线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

- 链表的长度可以动态改变,可以根据需要插入和删除节点。

2.2 链表的基本操作- 插入:在指定位置插入一个节点,调整指针指向。

- 删除:删除指定位置的节点,调整指针指向。

- 查找:根据节点的数据查找指定节点。

- 更新:根据节点的数据修改指定节点。

2.3 链表的应用场景- 链表常用于需要频繁插入和删除操作的场景,如LRU缓存机制。

- 在算法中,链表可以用来解决一些特定的问题,如判断链表是否有环。

三、栈3.1 栈的定义和特点- 栈是一种先进后出的数据结构,它只允许在栈顶进行插入和删除操作。

- 栈可以用数组或链表实现。

3.2 栈的基本操作- 入栈:将元素插入到栈顶。

- 出栈:将栈顶元素删除并返回。

- 查看栈顶元素:返回栈顶元素,但不删除。

- 判断栈是否为空:判断栈中是否有元素。

3.3 栈的应用场景- 栈常用于表达式求值、括号匹配等场景。

数据结构与算法(Python版)《数据结构》参考答案(A卷)

数据结构与算法(Python版)《数据结构》参考答案(A卷)

数据结构与算法(Python版)《数据结构》参考答案(A卷)引言概述:数据结构与算法是计算机科学中非常重要的概念,它们对于程序的性能和效率有着直接的影响。

本文将介绍数据结构与算法的基本概念和原理,并提供《数据结构》参考答案(A卷)的Python版实现。

一、数据结构的基本概念和分类1.1 线性结构- 线性结构是数据元素之间存在一对一的关系,常见的线性结构有数组、链表和栈等。

- 数组是一种连续存储的线性结构,可以通过下标直接访问元素,但插入和删除操作效率较低。

- 链表是一种离散存储的线性结构,通过指针将各个节点连接起来,插入和删除操作效率较高。

- 栈是一种特殊的线性结构,采用后进先出的原则,常用于递归、表达式求值等场景。

1.2 非线性结构- 非线性结构是数据元素之间存在一对多或者多对多的关系,常见的非线性结构有树和图等。

- 树是一种层次存储的非线性结构,由节点和边组成,常用于表示层次关系,如文件系统、二叉搜索树等。

- 图是一种任意存储的非线性结构,由顶点和边组成,常用于表示网络、社交关系等复杂关系。

1.3 常用数据结构的应用场景- 数组适合于随机访问和元素固定的场景,如矩阵运算、图象处理等。

- 链表适合于频繁插入和删除操作的场景,如LRU缓存、大整数运算等。

- 栈适合于递归和回溯等场景,如括号匹配、浏览器前进后退等。

- 树适合于层次关系的场景,如文件系统、数据库索引等。

- 图适合于复杂关系的场景,如社交网络、推荐系统等。

二、常用算法的基本原理和实现2.1 排序算法- 冒泡排序是一种简单的比较排序算法,通过相邻元素的比较和交换来实现排序。

- 快速排序是一种分治算法,通过选取一个基准元素将数组划分为两个子数组,并递归地对子数组进行排序。

- 归并排序是一种分治算法,通过将数组划分为两个子数组并分别排序,然后将两个有序子数组合并成一个有序数组。

2.2 查找算法- 顺序查找是一种简单的查找算法,通过逐个比较元素来查找目标元素。

数据结构C语言实现之hanoi塔问题

数据结构C语言实现之hanoi塔问题

y
move(Sx, n, Sz);
//将编号为 n 的圆盘从 x 移到 z
Hanoi(n-1, Sy, Sx, Sz); //将 y 上编号为 1 至 n-1 的圆盘利用 x 移到z} Nhomakorabea}
void main() {
SNode *Sx, *Sy, *Sz; int i = 0, n = 0; char ck = 0;
//将 x 上的圆盘编号
i++;
}
Hanoi(n, &Sx, &Sy, &Sz);
printf("\n 从 X 移到 Z 的结果是:\n");
Print(&Sz);
}
m = Pop(S1); Push(S2, m); }
void Hanoi(int n, SNode **Sx, SNode **Sy, SNode **Sz)
{
if (n == 1)
move(Sx, 1 , Sz);
//将编号为 1 的圆盘由 x 移到 z
else
{
Hanoi(n-1, Sx, Sz, Sy); //将 x 上编号为 1 到 n-1 的圆盘利用 z 移到
int data; struct Stack *next; }SNode;
void InitStack(SNode **S) {
*S = (SNode *) malloc (sizeof(SNode)); (*S)->next = NULL; //先建立一个带头结点 }
void Push(SNode **S, int ck)
void Print(SNode **S) {
SNode *p; p = (*S)->next; while(p) {
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

举例说明: 以三阶Hanoi塔为例,我们所需要的7个步骤是: 1——>Z 2——>Y 1——>Y 3——>Z 1——>X 2——>Z 1——>Z 则对于n阶Hanoi塔: n = 1时只需将编号为1的圆盘从X座移至Z座 n > 1时,我们分三个阶段: 1:将X塔座上的n-1个圆盘按照规定移至到Y塔座 2:将编号为n的圆盘由X座移至Z座 3:利用X塔座,将Y塔座上的n-1个圆盘按规定移至到Z塔 座
n阶Hanoi塔问题
解题思路汇报
专业:计算机科学与技术 班级:A班 学号:017 姓名:孙志佳
1
题目介绍
2
分析问题复杂性及举例说明
3
程序代码
一、题目介绍: 假设有三个命名为XY Z的塔座 ,在塔座X上插有n个直径 大小不相同,由小到大编号为1 ,2 ,3 ,· · ·,n的圆盘, 要求将X座上的圆盘移至塔座C并按同样的顺序叠排。 圆盘移动必须遵守下列规则: 1:每次只能移动一个圆盘 2:圆盘可以插在任意一个塔座上 3:任何时刻都不能将一个较大的圆盘放在一个较小的 圆盘上
二、分析问题复杂性及举例说明: 分析: 若有n个盘子,則移动完所需之次数为2^n - 1,所以当盘数为64 时,则所需次数为: 2^64 - 1 = 18446744073709551615 为5.05390248594782e+16年,也就是约5000世纪,如果对这 数字没什么概念,就假设每秒钟搬一个盘子好了,也要约5850 亿年左右。
图例
x
y
z
三、程序代码: #include <stdio.h> void hanoi(int i , char X , char Y , char Z); void move(int i , char x , char y); int main() { int n ; printf("请输入n的值:"); scanf("%d",&n); hanoi(n , ‘X' , ‘Y' , ‘Z'); return 0 ; } void hanoi(int i , char X , char Y , char Z) { if(); } else { hanoi(i - 1 , X , Z , Y); //函数递归调用 move(i , X , Z); hanoi(i - 1 , Y , X , Z); } } void move(int i , char x , char y) { static int c = 1 ; //局部变量i申明为 static printf("%d: %d from %c ——> %c /n", c++ , i , x , y); }
相关文档
最新文档