/************************************************************************/
/* 数据结构:栈应用:汉诺塔(Hanoi)问题 */
/* 挑灯看剑-shuchangs@126.com 2010-10 */
/* 云歌国际(Cloud Singers International) www.cocoral.com */
/************************************************************************/
//参见版面《数据结构:栈应用_求解汉诺塔(Hanoi)1》
//循环函数:将from中的前n-1个元素通过tmp搬运到to中
void recursion(int n, StackPointer from, StackPointer tmp, StackPointer to,
int* cnt)
{
static void move(StackPointer a, StackPointer b, int* cnt);
if (n == 1)
{
move(from, to, cnt);
}
else
{
recursion(n - 1, from, to, tmp, cnt); //将from中的前n-1个盘子搬运到tmp中,to作辅助塔
move(from, to, cnt);
recursion(n - 1, tmp, from, to, cnt); //将tmp中的前n-1个盘子搬运到to中,from作辅助塔
}
}
static void move(StackPointer a, StackPointer b, int* cnt)
{
Node rtnN =
{
0, NULL, NULL
};
NodePointer N = &rtnN;
StackOut(a, N);
StackIn(b, N->data);
*cnt += 1; //统计搬运次数
}
运行测试结果如下:
--------------------------------
汉诺塔:搬运前 A塔 盘子情况:
栈长度:4
打印结点信息(栈顶到栈底):
Node[4] = 1
Node[3] = 2
Node[2] = 3
Node[1] = 4
B塔 盘子情况:
栈长度:0
打印失败!栈为空!
C塔 盘子情况:
栈长度:0
打印失败!栈为空!
--------------------------------
--------------------------------
汉诺塔:搬运后 A塔 盘子情况:
栈长度:0
打印失败!栈为空!
B塔 盘子情况:
栈长度:0
打印失败!栈为空!
C塔 盘子情况:
栈长度:4
打印结点信息(栈顶到栈底):
Node[4] = 1
Node[3] = 2
Node[2] = 3
Node[1] = 4
--------------------------------
搬运次数合计:15
Press any key to continue
分享到:
相关推荐
汉诺塔(Hanoi)问题,也称为艾斯特拉达问题或移塔问题,是一个经典的递归算法问题,源于19世纪由法国数学家艾德蒙·朗利所提出。问题的目标是将一个堆栈中的所有盘子,通过三个柱子在有限步骤内从初始柱子A移动到...
在给定的C++代码片段中,我们看到的是通过栈数据结构来模拟和解决汉诺塔问题的一种方法。下面,我们将深入探讨汉诺塔问题本身、如何用栈来模拟汉诺塔的过程以及代码中所涉及的关键概念。 ### 汉诺塔问题概述 汉诺...
汉诺塔(Hanoi Tower)问题是一个经典的递归问题,它由三个柱子及不同大小的圆盘组成。游戏的目标是将所有圆盘从一个柱子移动到另一个柱子上,并遵循以下规则: 1. **每次只能移动一个圆盘**。 2. **大盘子不能放在...
汉诺塔(Hanoi)问题是一个经典的递归问题,它涉及到三个柱子和一堆不同大小的盘子。目标是将所有盘子从一个柱子移动到另一个柱子,每次只能移动一个盘子,并且任何时候大盘子都不能位于小盘子之上。Java语言可以很...
汉诺塔问题是一个经典的递归算法案例,它不仅在计算机科学领域有着广泛的应用,同时也被用来教授递归思想的基础知识。这个问题最早由法国数学家Édouard Lucas于1883年提出,并以其发明者的名字命名。汉诺塔问题涉及...
递归是一种强大的工具,广泛应用于数据结构(如树和图的遍历)、搜索算法(如深度优先搜索)以及其他许多复杂问题的求解。通过理解和实践汉诺塔问题,C语言学习者能够更好地掌握递归这一核心概念,为后续的编程学习...
非递归算法通常需要额外的数据结构来跟踪当前的状态,例如盘子的位置和待移动的盘子。非递归算法的代码可能更复杂,但执行效率通常更高,因为它避免了递归带来的栈空间消耗。 "非递归解决汉诺塔,每一步都有确切解....
汉诺塔(Towers of Hanoi)问题来自一个古老的传说:在世界刚被创建的时候有一座钻石宝塔,其上有64个金碟。所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔。从世界创始之日起,婆罗门...
- **递归算法演示**:包括汉诺塔(Hanoi)、皇后问题(Queen)、迷宫问题(Maze)和背包问题(Knap)的解决算法。 - **模拟银行**:BankSimulation 展示了队列在银行服务中的应用。 - **表达式求值**:Exp_...
理解并掌握汉诺塔的递归实现,对于深入学习算法和数据结构具有重要意义。 此外,汉诺塔问题还可以用非递归方式解决,例如利用栈或迭代的方法,这同样值得探索和学习。对于初学者而言,通过汉诺塔问题的学习,可以更...
递归,作为一种解决复杂问题的策略,是汉诺塔问题求解过程中的核心。递归的基本思想是将大问题分解为多个相似的小问题,直到达到可以直接解决的最小子问题。在汉诺塔问题中,我们通过递归将移动n个盘子的问题转化为...
汉诺塔是一个经典的递归问题,源于...递归是计算机科学中的重要概念,广泛应用于数据结构(如树和图的遍历)、算法(如排序和搜索)以及各种复杂问题的求解。理解并能熟练运用递归,对提升Java程序员的能力至关重要。
此外,汉诺塔问题还可以帮助我们理解栈的数据结构,因为递归本质上就是栈的运用,每次函数调用都会将相关信息压入栈中,待调用返回时弹出。递归算法的效率主要取决于递归深度,因此在实际问题中,如果圆盘数量巨大,...
- **2184**, **2175**, **2511**, **2587**, **1007**, **4033**, **2899**, **1062**, **1173**: 其他编号也可能涉及汉诺塔问题的不同方面,如特定数据结构的应用、算法优化技巧等。 通过对汉诺塔问题及其变种的...
Hanoi(汉诺)塔问题作为一个古典的数学问题,一直以来都是数据结构中递归算法的经典案例, 几乎没有介绍过其他的方法来解决此问题。文章分析讨论了一种非递归算法。
理解递归是学习计算机科学和编程的重要部分,因为它在许多领域,如数据结构(如树和图的遍历)、算法(如排序和搜索)以及问题求解策略中都扮演着关键角色。通过练习和应用递归,你可以提高自己的编程能力和问题解决...
递归算法不仅在汉诺塔问题中应用广泛,还在数据结构(如树和图)、搜索算法(如深度优先搜索)和其他许多计算问题中发挥着重要作用。了解并掌握递归思想是每个程序员必备的技能之一,而C语言提供了一个简洁的平台来...
在C和C++中实现汉诺塔可以帮助我们理解递归算法和数据结构的应用。本项目包含不同方法实现的汉诺塔,既有递归版本,也有非递归版本,为学习者提供了丰富的学习资源。 首先,我们要理解汉诺塔问题的基本规则:有三根...
在编写汉诺塔程序时,我们将用到基本的数据类型(如int、void等)、控制结构(如if语句、while循环、for循环)和函数定义。 汉诺塔问题通常采用递归方法解决。递归是函数调用自身的一种方式,通过不断缩小问题规模...