递归实现汉诺塔的思路

文章介绍了如何使用Java编程语言解决经典的汉诺塔问题,通过递归策略详细展示了如何将A塔的圆盘按照规则移动到C塔,涉及单盘和多盘情况的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决汉诺塔问题(java代码)

目录

解决汉诺塔问题(java代码)

1.简介

2.解决思路

1.一个圆盘

2.多个圆盘

3.完整代码 

1.简介

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。 传说中,大梵天创造世界时,做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

2.解决思路

现在有3根柱子分别为A,B,C,把A塔上的圆盘从大到小依此挪到C塔上去

代码实现:我们首先可以定义A塔上的圆盘个数为n个(数量不同,移动次数不同)

import java.util.Scanner;
public class Tower {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();//输入A塔上的圆盘个数
        play game = new play();//创建变量game
        //play为新创建的类,完整代码有体现
        game.Hanoitower(num,"A","B","C");//Hanoitower为实现游戏的具体方法。A,B,C是三个塔,用字符来表示。
    }
}

1.一个圆盘

如上图,仅需要移动一次,即直接从A塔挪到C塔。

//创建方法Hanoitower,接收n和字符A,B,C
public void Hanoitower(int num,String A,String B,String C) {
        if(num == 1) {
            //只有一个圆盘。
            System.out.println(A+"-->"+C);//把A上的圆盘直接挪到C上去。
        }

2.多个圆盘

如上图,A塔借助B塔移动了3次把圆盘全部移动到了C塔上,大于两层塔时借助C塔把除底部塔以外的塔(看成一个整体)挪到B塔上。 

我们将这两个塔看成两部分(多个塔的拆分思路),最底层的塔和底层以上的塔。

public void Hanoitower(int num,String A,String B,String C) { 
if(num == 1) {
            //只有一个圆盘。
            System.out.println(A+"-->"+C);//把A上的圆盘直接挪到C上去。
        } else {
            //大于一个圆盘
            //首先借助C塔,把A塔上除最后一个圆盘以外的其他圆盘挪到B塔上。
            Hanoitower(num-1,A,C,B);
            //把A塔最后一个圆盘挪到C塔上
            System.out.println(A+"-->"+C);
            //利用A塔,把B塔上的圆盘挪到C塔上。
            Hanoitower(num-1,B,A,C);
            //共挪动了2的num次方减一次
          }
}

 仔细分析一下这个代码的执行

1.当n=2时,num=2,执行else语句

2.a.进入函数 Hanoitower(num-1,A,C,B),此时num = 1

      

 此时将A赋给A,C赋给B,将B赋给C;

 进入函数执行System.out.println(A+"-->"+C),  输出A--B

   b.执行 System.out.println(A+"-->"+C),输出A-->C

   c.执行函数 Hanoitower(num-1,B,A,C),此时num = 1

与a同理,进入函数执行执行System.out.println(A+"-->"+C),输出B-->C

3.完整代码 

以上就是解决汉诺塔的全部思路,下面放入完整代码

import java.util.Scanner;
public class Tower {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        play game = new play();
        game.Hanoitower(num,"A","B","C");
    }
}
class play {
    public void Hanoitower(int num,String A,String B,String C) {
        if(num == 1) {
            //只有一个圆盘。
            System.out.println(A+"-->"+C);//把A上的圆盘直接挪到C上去。
        } else {
            //大于一个圆盘
            //首先借助C塔,把A塔上除最后一个圆盘以外的其他圆盘挪到B塔上。
            Hanoitower(num-1,A,C,B);
            //把A塔最后一个圆盘挪到C塔上
            System.out.println(A+"-->"+C);
            //利用A塔,把B塔上的圆盘挪到C塔上。
            Hanoitower(num-1,B,A,C);
            //共挪动了2的num次方减一次
        }
    }
}

有问题请在评论区留言,觉得有用的朋友可以点个赞支持一下。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值