汉诺塔最少步骤6层最快多少秒

跑64个汉诺塔,跑了两分钟没跑完……【c语言吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:563,794贴子:
跑64个汉诺塔,跑了两分钟没跑完……收藏
果断关了。
找c语言培训?中国C语言培训课程,,本月免费训练营火热开启中!找c语言培训?成就C语言编程牛人,抢!!!C语言课程免费试听名额,C语言总监名师主讲!
据说跑完了世界末日就到来了
我不知道啊!因为6个8个出来得很快,我本来想等一分钟也没问题。谁知道它不结束了。
2的64次方一分钟跑出来可以orz了
我犯二了。
如果输出步骤数目的话很快就完了。。。
用递归做很耗时啊!
没猜错他说输出2的64次方~~用快速幂+高精 最多6次就可以了,所以很快~~
unsigned long long.
回复2楼:不是说移动一次2秒才会到世界末日吗
专为满足各类行业和客户要求而设计,并已被证明可满足各个施工标准的要求。
不懂递归的孩子一边撸
登录百度帐号推荐应用《好看》依托百度技术,精准推荐优质短视频内容,懂你所好,量身打造最适合你的短视频客户端!汉诺塔3柱4层最快移动法_中华文本库
汉诺塔移动超详细步骤分解(4到6层)_体育/运动_生活休闲。汉诺塔移动超详细步骤...柱表示A、B、C三根柱子 2、环表示要移动的环,数字大则代表的环也大,数字...
(板书) (一)原题图: (二)移动第一次: (三)移动第二次: (四)移动第三...同学们 你们还记得开始那个关于汉诺塔的传说吗? 师: 传说中的柱子上有 64 个...
找到最小的盘 1,向左移动一步,移动到乙柱。 4,...小的一个移动 到大的上面(只可能有一种移法) 3...汉诺塔模拟程序报告 23页 3下载券
数据结构 汉诺塔...
四根柱子汉诺塔问题_计算机软件及应用_IT/计算机_专业...通过这个柱子来更快的把所有的盘子移到第三个柱子...* * 解决方法: * 依然采用分治法。 * * * ...
由一个塔 柱上移到另一根塔柱上,并且始终保持上...用人类的大脑直接去解3, 4或5个盘子的汉诺塔问题还...而且很容易用数学归纳 法证明算法的正确性,然而它的...
3. 4. 实验 环境 1. 2. 1. 汉诺塔 调研并...程序设计中,尽量使用符号常量来代替常数,这是一种好...将最上面的圆盘借用其余两根柱子移动,使得最后圆盘都...
递归是数学归纳法的逆过程。 递归函数是直接或通过另一个 汉诺塔的递归求解分析...(借助第三个柱子) ㈡第 1 个和尚我自己把第一柱子最后的盘子移动到第三柱子...
给出汉诺塔问题的两个非递归算法: 解集 递推法...1柱上 剩下的最后一个最大 的圆盘移 到 3柱, ...( 2 - 2) /3 组 0 2, 4 , 因此从 A ...
的情况 N=1 时直接从起始柱移到目的柱,算法结束...但是在 Lc-3 运行中发现,因为使用同样的算 法去...4页 免费 汉诺塔递归详解3个盘 暂无评价 1页 免费...
上不能放大圆盘,在三根柱子之间一次只能移 动一个...好了由大到小的 64 片金片,这就是所谓的 汉诺塔...&,x,z); f(n-1,y,x,z);} } N=3 N=4...汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
如果是初次接触类似的问题,乍看之下肯定会感觉无从下手。要把64个圆盘从a柱子移动到c柱子上,第一步应该怎么做?虽然可以肯定,第一步唯一的选择是移动a最上面的那个圆盘,但是应该将其移到b还是c呢?很难确定。因为接下来的第二步、第三步&&直到最后一步,看起来都是很难确定的。能立即确定的是最后一步:最后一步的盘子肯定也是a最上面那个圆盘,并且是由a或b移动到c&&此前已经将63个圆盘移动到了c上。也许你会说,管他呢,先随便试着移动一下好了。如果你这么做,你会发现,接下来你会面临越来越多类似的选择,对每一个选择都&试&一下的话,你会偏离正确的道路越来越远,直到你发现你接下来无法进行为止。如果将这个问题的盘子数量减为10个或更少,就不会有太大的问题了。但盘子数量为64的话,你一共需要移动约1800亿亿步(18,446,744,073,709,551,615),才能最终完成整个过程。这是一个天文数字,没有人能够在有生之年通过手动的方式来完成它。即使借助于计算机,假设计算机每秒能够移动100万步,那么约需要18万亿秒,即58万年。将计算机的速度再提高1000倍,即每秒10亿步,也需要584年才能够完成。注:在我的笔记本电脑上,每秒大约能够移动6~8百万步。虽然64个盘子超出了人力和现代计算机的能力,但至少对于计算机来说,这不是一个无法完成的任务,因为与我们人类不同,计算机的能力在不断提高。
一股脑地考虑每一步如何移动很困难,我们可以换个思路。先假设除最下面的盘子之外,我们已经成功地将上面的63个盘子移到了b柱,此时只要将最下面的盘子由a移动到c即可。如图:
当最大的盘子由a移到c后,b上是余下的63个盘子,a为空。因此现在的目标就变成了将这63个盘子由b移到c。这个问题和原来的问题完全一样,只是由a柱换为了b柱,规模由64变为了63。因此可以采用相同的方法,先将上面的62个盘子由b移到a,再将最下面的盘子移到c&&对照下面的过程,试着是否能找到规律:
将b柱子作为辅助,把a上的63个圆盘移动到b上
将a上最后一个圆盘移动到c
将a作为辅助,把b上的62个圆盘移动到a上
将b上的最后一个圆盘移动到c
也许你已经发现规律了,即每次都是先将其他圆盘移动到辅助柱子上,并将最底下的圆盘移到c柱子上,然后再把原先的柱子作为辅助柱子,并重复此过程。这个过程称为递归,即定义一组基本操作,这组操作将规模小一点(或大一点)的操作当做一个整体&&无需关心它的细节,只当它已经完成了&&然后执行剩下的操作。而在更小或更大的规模中也依此操作,直到规模达到预定值。在数学上,有些公式就是采用递归的方式定义的。例如阶乘和斐波那契数列(Fibonacci Sequence)。前者的公式为:规定0!=1!=1,对于n&=2,有n!=n*(n-1)!这里的n-1就是比n规模略小的阶乘,而1就是规模的最小值(预定值)(0是作为特殊值而专门规定的)。著名的斐波那契数列定义如下,可以看出,f(n)是由规模更小一些的f(n-1)和f(n-2)推导出来的:
f(0)=0,f(1)=1f(n)=f(n-1)+f(n-2) (n&=2)
因此,递归实际上就是用自己来定义自己。回到前面汉诺塔的问题上来。我们假设函数func(n, a, b, c)用于将n个圆盘由a移动到c,b作为辅助柱子。那么我们可以这样实现这个递归过程:
func:if n!=0 then
func(n-1, a, c, b)
;将n-1个盘子由a移动到b,以c为辅助柱子(注意参数顺序)
move a[n] to c
;将a上的最后一个盘子移动到c
func(n-1, b, a, c)
;将n-1个盘子由b移动到c,以a为辅助柱子
func中有两个递归调用,它们的规模刚好比n小1。注释说明了每行代码的作用和意图。正如注释里所强调的那样,注意参数的顺序&&参数位置不同,其代表的意义也不一样。第一个递归调用以c作为辅助柱子,这没有问题,因为c柱子的最下面的k个圆盘一定是所有圆盘中最大的k个,因此将其作为辅助柱子不会出现大圆盘在小圆盘之上的情况。
下面是使用Java实现的汉诺塔程序,程序使用Stack实例来保存每个柱子上的盘子及它们的顺序。Stack是队列的一种,其中的元素遵循&先进先出&(FIFO)的原则,即不允许从队尾取元素。这种队列通常也称为&栈&。栈对元素的进出约定与汉诺塔的规则一致。
resolve方法用来移动盘子,参数n表示要移动的盘子的数量,a是盘子所在的柱子,b是辅助柱子,c是目标柱子。注意此方法会首先检查参数n,当n为0时直接返回,这就是前面所说的&预定值&。如果没有对预定值的判断,resolve的递归过程将不会自然终止,而是无限进行下去,直到塞满系统内存堆栈而导致程序奔溃。
另外要注意的是程序将盘子的初始数量设为32个,你可以修改该值,但建议不要设置的过大,原因正如前面所计算的那样,如果采用64个圆盘,你将至少需要数百年才能看到结果(更可能的结果是由于步数太多,系统没有足够的内存而导致程序奔溃)。
import java.util.I
import java.util.S
public class HanoiTower {
public static void print(Stack&Integer& s) {
Iterator&Integer& i = s.iterator();
while (i.hasNext()) {
System.out.printf("%d ", i.next());
System.out.println();
public static void resolve(int n, Stack&Integer& a, Stack&Integer& b, Stack&Integer& c) {
if (n==0) return;
resolve(n-1, a, c, b);
c.push(a.pop());
resolve(n-1, b, a, c);
public static void main(String[] args) {
int count = 32;
Stack&Integer& a = new Stack&Integer&();
Stack&Integer& b = new Stack&Integer&();
Stack&Integer& c = new Stack&Integer&();
for (int i= i&0; i--) {
a.push(i);
long start = System.currentTimeMillis();
resolve(count, a, b, c);
long end = System.currentTimeMillis();
System.out.println((end - start)/1000);
在我的笔记本电脑上运行该程序,消耗的时间统计如下:(Intel Core i3 3.2GHz处理器,2.2GHz 3GB内存)
正如备注中所显示的,步数是圆盘数量的指数函数,即steps=2^n - 1,运行所需时间也遵从这个规律。扩展:汉诺塔问题的非递归实现
理论上来说,递归算法都能够改为循环来完成。例如阶乘问题,既可以用递归定义给出,也可以采用下面的方式来定义:
规定0的阶乘为1。对于其他自然数,n的阶乘可以表示为:
n!=1*2*3*...*n
这种方式实际上就是采用了循环来定义。
然而,并不是所有的递归都能简单直观地改写为循环,例如前面所介绍的斐波那契数列的定义,和本文所讨论的汉诺塔问题。
下面这个帖子介绍了不使用递归而是用循环来解汉诺塔问题的算法。
研究如何使用并行算法解决汉诺塔问题。例如,64个盘子,每次成功将一个盘子移动到目标柱子上的过程都是独立的。因此可以分别并行地计算。不过需要注意的是,成功移动第一个盘子的步数是最多的,占到总步数的1/2;而第二个盘子需要总步数的1/4&&最后一个盘子仅需1步。所以在实现并行方式时要考虑这种差异。而不是简单地使每个并行分支移动相同数量的盘子。
阅读(...) 评论()

我要回帖

更多关于 6层汉诺塔游戏解法图 的文章

 

随机推荐