汉诺塔算法

原创 2012年03月24日 11:05:04

       我的数据结构学习从汉诺塔开始,这个简单的算法我可是整整想了一晚上,现在终于有点明白了,上机单步了几遍,有所了解,吐舌头,还是写点什么以供以后参考,也希望能对正在学算法的盆友有所裨益······

       总得来说汉诺塔就是层叠递归调用的典型例子,一直是利用A—>B  A-->C  B-->C这样的单个步骤。

       具体来说,当盘数大于一时,不违背原则下(过程中总是大在下小的在上),A先借助B再放到C上。总是把盘数看成两个来解决问题。

       比如说,当盘数为二时,顾名思义,这个很简单只要三下即可完成。这个时候,可以这样想,如果是三个,就相当于二个完成,还有一个待完成,(注意要有把问题简化为两个盘的思想,这样是递归思想的思想实现),那么把完成的看成一个,剩下待完成的看成一个(带完成的还可以把最近要完成的看成一个,剩下的先别管),这样问题就回到了二个盘数时的第一步完成状态,接下来就是递归的精华了(我是膜拜数学的强大,一个式子可以表达万种情感),然后C上的(二个看成一个那)在借助B放到A上,这样第三个就可以从B放到C上,接下来又是二个了(这个是真正的二个),看基本步骤完成。当盘数是N时,也是利用这种思想,一步一步简化,递归完成。

       接下来谈一下N个盘要几次完成问题

        书上说是2^n-1次,经过计算验证是正确的。当然我有我的思考计算,哈哈····思考如下:

        当完成n个时设用M(n)次,那么,如上我说的算法当完成n个(也就是n+1个时了)还有一个,这时需要把在C上的看成一个,借助B移动到A上(这时最后一个已到B上),当然要做M(n)次搬动了,完成后,B上的最后一个((n+1)个)搬动到C上。这时,问题又回到了n次开始,当然需要M(n)次了。这么一来就是M(n)*2次,加上最后一个的两次,总共是M(n)*2+2=M(n+1)次,好了现在是纯数学问题了,可以利用数学知识算出来最后结果,(我还没算,哈哈,我数学不好呀),步骤没错的话,应该结果是M(n)=2^n-1.

        以上只是个人体会,写的有些弱智,有什么不正确的还请高人指教。

         下面是程序具体实现,(上面为C下面C++)仅供参考得意······

                                                       

#include<stdio.h>                  
int  a=0;
void hanoi(int n, char A, char B, char C)
 {
 
 a++;
 if(n==1)
 {
  printf("Move sheet %d from %c to %c\n",n,A,C);
    }
 else
 {
  hanoi(n-1,A,C,B);
  printf("Move sheet %d from %c to %c\n",n,A,C);
  hanoi(n-1,B,A,C);
 }
 printf("a是:%d\n",a);
}
int main()
{
 int n;
 printf("请输入盘数:");
 scanf("%d",&n);
 hanoi(n,"A","B","C");
 return 0;
}
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#include<iostream>
using namespace std;
void move(int n, char s, char d)
{
    cout<<n<<","<<s<<"->"<<d<<endl;
}
void hanoi(int n, char A='A', char B='B',char C='C')
 {   if(1==n)
          move(n,A,C);
  else
  {
      hanoi(n-1,A,C,B); move(n,A,C); hanoi(n-1,B,A,C);
  }
}
int main()
{
 int i=0;
 cout<<"请输入盘数:";
 cin>>i;
    hanoi(i);
 return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

若果有什么修给的地方还请指出,学习阶段需要交流······
 


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

"汉诺塔"算法-之通俗易懂,简单的原理-java编程

1.汉诺塔 2.三步曲 3.递归
  • nzfxx
  • nzfxx
  • 2016年06月04日 14:22
  • 4632

经典递归解决汉诺塔!

算法:当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。             当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,...

汉诺塔递归算法理解及实现

汉诺塔:(Hanoi)是一种玩具,如图: ![这里写图片描述] (http://img.blog.csdn.net/20150430225337439) 从左到右 A B C 柱 大盘子在...

汉诺塔的递归算法与解析

从左到右 A  B  C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面. 如果有3个盘子, 大中小号, 越小的越在上面, 从上面...

汉诺塔算法思想

问题描述 一说到递归可能就会想到最经典的汉诺塔问题. 先把汉诺塔问题简短的描述下.假如有start ,tmp , end三个柱子. 1.初始条件.最开始是tmp和end为空,而start上面有按...

汉诺塔算法 C++

  • 2010年10月29日 07:27
  • 3KB
  • 下载

汉诺塔问题算法以及实现

  • 2010年05月01日 10:51
  • 4KB
  • 下载

数据结构学习之_汉诺塔递归算法

/* 2013年3月25日 22:59:36 xulei 汉诺塔: 设有n个盘子, 源柱子: A 中间柱子: B 目标柱子: C 1. 先把A柱子上的前n-1个盘子从A借助C 移动到B;...

汉诺塔算法演示

  • 2008年01月09日 23:33
  • 44KB
  • 下载

c语言汉诺塔栈的算法

  • 2012年12月25日 14:58
  • 251KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:汉诺塔算法
举报原因:
原因补充:

(最多只允许输入30个字)