问题描述
一说到递归可能就会想到最经典的汉诺塔问题.
先把汉诺塔问题简短的描述下.假如有start ,tmp , end三个柱子.
1.初始条件.最开始是tmp和end为空,而start上面有按从大到小往上摆的盘子(塔状).
2.最终目标.实现把所有盘子放到end柱子上,顺序跟之前的start柱子一样.从大到小往上的塔状形.
3.限制条件.我们在搬动的时候可以把tmp柱子拿来临时用下,不过在搬动的任何时候不能出现小盘到大盘上面的情况.
解决思路
我们先考虑最简单的情况,假如只有一个盘子,就直接从start搬到目的地end.如果两个盘子则是先把小盘子放tmp,然后大盘子放end,最后再把tmp里的盘子放end.
假如有N个盘子时,我们可以这样想,底下最大的那个我们先不管.(因为最大的如果你把它放那不动,则可以无视它的,其他盘子可以在三个柱子上移来移去.它是最大嘛).
于是我们可以先想办法把start上的N-1个盘子搬到tmp上,然后把最大的那个搬end上,最后再想办法把tmp上的N-1个搬到end上.
于是当有盘子3个时,先把上面2个搬到tmp上,再把最大那个搬到end,最后再想办法把tmp上的2个搬end上来.
C++实现代码
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int totalSteps = 0; //用来计算所有操作总数是多少
//下面这个函数就是算出具体步骤的
void Hanoi(int totalNum, string start, string tmp, string end)
{
if(totalNum == 1)
{
//如果只有一个盘了,则直接从开始的start柱子搬到目的柱子end
string stepInfo = "Move disk from " + start +
" to " + end;
cout<<stepInfo<<endl;
totalSteps++;
}
else
{
Hanoi(totalNum - 1, start,end, tmp); //步骤1.先把start上的totalNum - 1个盘子搬到tmp上
string stepInfo = "Move disk from " + start +
" to " + end; //步骤2.把start上剩下的那大那个盘子直接盘end柱子上
cout<<stepInfo<<endl;
totalSteps++;
Hanoi(totalNum - 1, tmp, start, end); //步骤3.把tmp柱子上totalNum -1个盘子搬到end柱子上
}
}
int main()
{
int totalDiskNum = 4;
Hanoi(totalDiskNum, "start",
"tmp",
"end");
cout<<totalSteps<<endl; //结果是15
return 0;
}
总的步骤数规律是2^N - 1.其中N是盘子总数
所以N为4时,2的4次方为16,减1就是15
分享到:
相关推荐
汉诺塔问题是一个经典的递归算法案例,它不仅在计算机科学领域有着广泛的应用,同时也被用来教授递归思想的基础知识。这个问题最早由法国数学家Édouard Lucas于1883年提出,并以其发明者的名字命名。汉诺塔问题涉及...
### 数据结构与汉诺塔算法...掌握汉诺塔算法不仅可以提高编程技巧,还能加深对递归思想的理解。 以上代码提供了不同语言下的实现方式,帮助读者理解和实践汉诺塔算法。无论是初学者还是有经验的开发者,都能从中获益。
### 汉诺塔问题迭代算法与分析 #### 引言 汉诺塔问题是一个经典的计算机科学问题,通常被用来教授递归的概念。长久以来,人们普遍认为递归是解决汉诺塔问题的最佳方法。然而,近年来研究者们发现迭代算法也可以...
汉诺塔(Hanoi Tower)问题是一个经典的计算机科学问题,源于19世纪末法国数学家爱德华·卢卡斯提出的一个智力游戏。...通过汉诺塔问题的学习,我们可以更好地运用递归思想,解决现实世界中的诸多挑战。
描述中的"给出了计算结果和塔盘移动过程"意味着这个源码不仅实现了汉诺塔算法,还可能包含可视化界面,能够动态显示每个步骤,帮助初学者更好地理解这个过程。通过这样的可视化演示,用户可以直观地看到每个圆盘的...
#### 双色汉诺塔算法解析 双色汉诺塔(Two-color Hanoi Tower)是基于传统汉诺塔游戏的一种变体。传统汉诺塔游戏由三个柱子及不同大小的圆盘组成,玩家的目标是将所有圆盘从初始柱子移动到目标柱子上,且每次只能...
汉诺塔算法,又称为汉诺塔问题,是一种经典的递归问题,源于印度的一个古老传说。该问题涉及三根柱子A、B、C,以及若干个大小不一的穿孔圆盘,初始时所有圆盘按照从大到小的顺序堆叠在柱子A上。目标是将所有圆盘按照...
总的来说,汉诺塔问题展示了递归思想在解决复杂问题中的应用,同时也提醒我们在面对指数级增长的问题时,要考虑算法的时间复杂度和潜在的优化策略。通过将递归转换为循环,我们可以降低程序的运行成本,提高效率。
汉诺塔游戏不仅锻炼玩家的逻辑思维能力,也常常被用于计算机科学的教学,因为它展示了递归算法的应用。 Flash小游戏是一种基于Adobe Flash技术的互动娱乐形式,它可以在网页上直接运行,无需安装额外软件。这种游戏...
在C语言和游戏编程中,实现汉诺塔算法可以帮助开发者理解递归思想和解决问题的能力。在这个名为"archive_VC++汉诺塔算法.zip.zip"的压缩包中,包含了一个VC++编写的汉诺塔算法实现,以及一个名为"output.txt"的文件...
汉诺塔游戏是一种基于递归算法的经典逻辑游戏,源自印度古老传说,由法国数学家爱德华·卢卡斯在19世纪末正式提出。在这个简单的汉诺塔HTML网页游戏中,玩家将体验到如何通过一系列合法移动将全部圆盘从一根柱子...
汉诺塔游戏是一种经典的递归算法问题,源自印度的一个传说,它通过动画演示能更直观地展示算法的运作过程。这个压缩包包含了“汉诺塔动画演示”的资源,包括一个名为“Hanoi.exe”的可执行文件,可能是用来运行汉诺...
汉诺塔图形解法(递归算法) 汉诺塔图形解法是利用递归算法来解决汉诺...HanNoTa 图形解法是一种使用递归算法来解决汉诺塔问题的经典示例,能够直观地显示汉诺塔的移动过程,帮助用户更好地理解递归算法的思想和实现。
总的来说,“VC++汉诺塔算法.7z”中的源码为我们提供了一个使用C++实现的经典递归问题的实例,对于学习C++编程和理解递归思想具有很好的参考价值。通过阅读和运行这段代码,我们可以更深入地理解汉诺塔问题以及如何...
任意输入N个盘,在三个柱子上实现汉诺塔问题的非递归求解,用栈进行
在提供的文件`1559四柱汉诺塔.cpp`中,我们可以预期看到实现四柱汉诺塔算法的C++代码。这个文件可能包含了主函数`main`,用于初始化游戏状态并调用`moveDisks`函数,以及一个递归函数`moveDisks`,它负责按照上述...
- **M 根柱子的汉诺塔问题**:当柱子数量M为3时,可以使用经典的汉诺塔算法,即 pow(2,n) - 1 的公式计算最少移动次数。对于M不等于3的情况,使用递归策略,通过计算不同分割点的最少移动次数并找到最小值。 - **...
汉诺塔问题的解决可以通过一个名为“汉诺塔算法”的递归方法来实现。该算法的核心思想是先将上部的n-1个圆盘借助柱子B从柱子A移动到柱子C,然后将剩余的第n个圆盘直接从柱子A移动到柱子C,最后再借助柱子A将柱子B上...