大学常见算法的java实现及思考-汉诺塔问题

大家好,本人是2010级计算机学院学生一枚。今年暑假希望同大家一起对大学所有讲过的算法进行一次细致的回顾。在此我会把回顾的点点滴滴记下,希望对大家有些帮助。本人也是菜鸟一枚,如在表述中有不对的希望大家指出。好了,废话不多说,下面进入这个系列的第一集。

问题描述:

汉诺塔问题相信大家不会陌生,具体的我引用百度百科的说法:

一位法国数学家曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

在这里我们需要编写一个程序,打印出每次搬运的过程(例如:把第3片金片由第2根针搬到第1根针)。

思考:这个问题是一个典型的递归问题。网上有很多的代码以及分析,但是我个人觉得都不是特别细致与全面,常常使得读者有一种“似懂非懂”的感觉。我记得我当初学习这个问题的时候经历了好长时间才慢慢理解(吐舌头)。

这里我们假设一共有n片金片(初始状态时候位于a号柱子上),有3根柱子分别编号为A,B,C。假设我们编写了函数move(n,a,b,c)来解决这儿问题。这里move的几个参数的意思分别是金片个数,a号柱子(用于放置初始时候的金片),b号柱子(用于在整个过程中辅助移动这个过程),c号柱子(目标柱子,用于终态时候放置所有的金片)。

为了达到目的,我们采用以下移动方法:先将n-1片金片先移动到辅助柱子b上,这样以来a柱子上余留的金片必然是所有的金片中最大的那个,然后将a上的金片移动到c上。由于此时c上的金片是全局中最大的金片,所以在接下来的移动过程中我们可以”无视“此金片。那么此时问题变成了我们要将n-1片金片从b柱子借助a柱子移动到c,用函数表示为:move(n-1,b,a,c)。接下来我们继续按照刚才的方法移动金片,我们将n-2片金片移动到a上,此时在b上省下的必然是全局第二大的金片(此时第一大的金片在c柱子上),我们再把全局第二大的金片移动到c上,此时的状态用函数表示为:

move(n-2,a,b,c)至此递归已经形成。当只有一片金片的时候很显然我们可以直接把它移动到目标柱子上,当有两片的时候我们可以借助辅助柱子移动,以上作为我们的递归结束条件。

程序截图:

源码下载:http://download.csdn.net/detail/kenanlinghui/5732859(这里我就收一积分的辛苦费啦,吐舌头)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值