汉诺塔问题

经典的递归解决方案,汉诺塔问题请自行百度查询,这里不做叙述,直接上代码:

问题要求梗概:

  • 每一次只能操作最上层的那个盘子
  • 每个小盘子只能放在比它大的盘子上面
  • 盘子可以从任何一个木桩上放到任何另一个。
public class Hanoi {

    public static void hanoi(int n, int p1, int p2, int p3)//将n个盘子由初始塔移动到目标塔(利用借用塔 {
        if(n == 1){
            System.out.println("盘子从 "+ p1 + " 移到" + p3);//只有一个盘子是直接将初塔上的盘子移动到目的地 
        }
        else {
            hanoi(n-1, p1, p2, p3); //先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
            System.out.println("盘子从 "+ p1 + " 移到" + p3);//将剩下的一个盘子移动到目的塔上 
            hanoi(n-1, p2, p1, p3);//最后将借用塔上的n-1个盘子移动到目的塔上 
        }
    }

    public static void main(String[] args) throws IOException {
        int num = 0;
        String str;
        BufferedReader keyIn = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入盘子数量:");
        str = keyIn.readLine();
        num = Integer.parseInt(str);
        hanoi(num, 1, 2, 3);
    }

}

p1,p2,p3为三个柱子,所有盘子都由p1移动到p3,p2作为辅助。

运行结果为:运行结果

首先它是有一个规律的,总体氛围三个步骤(设总共n个盘子):
1、将n-1个盘子,从p1移动到p2
2、将第n个最大的盘子(最底下),从p1移动到p3
3、将n-1个盘子,从木桩2移动到木桩3

每次递归执行下来其实都会将最大的那个盘子放到目的地(p3)上的,这个问题时很明显的递归逻辑,只要按照这个一直递归最后就会执行完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值