Java中的河内之塔算法

这篇博客介绍了Java中如何实现经典的河内之塔问题,通过递归算法详细阐述了从1到4个盘子的转移步骤,并给出了具体的Java代码示例。适合初学者理解递归思想和河内之塔问题的解决过程。
摘要由CSDN通过智能技术生成

作为一个小萌新,刚刚接触Java,如果有写的错误跟不好的地方请各位大神指正害羞

河内之塔的介绍:

河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于 1883 年从泰国带至法国的,河内为越战时
北越的首都,即现在的胡志明市; 1883 年法国数学家 Edouard Lucas曾提及这个故事,据说创世
纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置 64
个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根
石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬
运完毕之时,此塔将毁损,而也就是世界末日来临之时。

算法原理:当第一根pag上只有一个disc时,我们只需要将这个disc直接移动到第三根pag上,这时我们设需要移动的次数为a1.当第一根pag上有两个disc时,我们要先将
小的那个移到第二根上面,在把大的那个移动到第三根上面,然后把小的从第二根移动到第三根上面,这样就可以完整的将全部disc从第一根移到第三根上面了,这时移动的次数可以看作是a2=a1+1+a1。当第一根pag上面有三个disc时,我们把前两个当成一个整体,然后按照第二个方法的移动方式,先将上面的整体移动到第二根上面,这时用掉的次数为a2=a1+1+a1,然后再将最下面的disc移到第三根上面,这时用的次数为1,然后再将上面的整体从第二根全部移到第三根上面,这样用的次数也为a2=a1+1+a1。所以这个时候a3=a2+1+a2。依照这个方法下去,an= an-1 +1 +an-1————》an= 2an-1 +1是跟等差数列,所以我们可以用等差数列的求和公式进行次数的求和。

1个盘,A->C,1步,

2个盘,A->B,A->C,B->C,3步

3个盘,把前2个移到B,需要3步,再把第三个移到C,1步,再把B上2个移到C,总共s2+1+s2=7步

4个盘前面3个移到B,S3步,第四个移到C,1步,吧B上3个移到C,S3步,总共S3+1+S3=15步

代码:

package 河内之塔;
import java.util.Scanner;
public class 测试 {
    
 public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  System.out.println("请输入大小:");
  int n = scanner.nextInt();      
  if(n<2){
      System.out.println("转移的次数为1");
     }else if(n==2){
      System.out.println("转移的次数为3");
     }
  else if(n>2){
      int s;
      s=2*(n-1)-1;
      System.out.println("转移的次数为"+s);
     }
  
 }
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值