java汉诺塔代码_java笔记--代码实现汉诺塔移动过程和移动次数

本文通过Java代码介绍了汉诺塔问题的解决思路,包括如何移动盘子和计算移动次数的递推公式,并提供了一个递归算法实现,能够展示具体的移动步骤和总移动次数。
摘要由CSDN通过智能技术生成

汉诺塔

有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,

要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小

盘子上方。

问题:

1.如何移动;

2.n个盘子移动多少次(count)?

解决问题1:

为了将第n个盘子从A移动到C,就得先将第n个盘子上面的第n-1盘子移动到B上;

同样的,要想将B上的第n-1个盘子移动到C上,就得先将第n-2个盘子移动到A上。

解决问题2:

当n = 1 时,count = 1;

当n = 2 时,count = 3;

当n = 3 时,count = 7;

当n = 4 时,count = 15;

…………

根据以上可得表达式:

count(1) = 1

count(n) = 2*count(n)+1 (n>1)

即n个盘子移动的次数表达式为:

count(n) = 2^n - 1 (n>0)

用代码实现为:

package com.xhj.data;

import java.util.Scanner;

/**

* 递归算法实现汉诺塔

*

* @author XIEHEJUN

*

*/

public class HanoiTower {

/**

* 定义移动次数

*/

private static int count;

/**

* 设置移动次数的起始值

* @param count

*/

public static void setCount() {

HanoiTower.count = 1;

}

/**

* 获取移动次数

*

* @return

*/

public static int getCount() {

return count-1;

}

/**

* 移动递归

*

* @param num

* 盘子数

* @param from

* 柱子A

* @param inner

* 柱子B

* @param to

* 柱子C

*/

public static void moveDish(int num, char from, char inner, char to) {

if (num == 1) {

System.out.println("\t\t**\t"+count++ + " " + num + "号盘子从" + from + "移动到" + to);

} else {

moveDish(num - 1, from, inner, to);

System.out.println("\t\t**\t"+count++ + " " + num + "号盘子从" + from + "移动到" + to);

moveDish(num - 1, inner, from, to);

}

}

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

try {

for (;;) {

System.out.print("请输入盘子的个数:");

int n = sc.nextInt();

System.out.println("\t\t**********************************");

System.out.println("\t\t**\t移动步骤为:");

setCount();

moveDish(n, 'A', 'B', 'C');

System.out.println("\t\t**\t一共移动的步数为:" + getCount());

System.out.println("\t\t**********************************");

}

} catch (Exception e) {

System.out.println("输入数据不正确,请输入整数");

main(null);

}

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值