A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© niuapp 中级黑马   /  2015-5-19 21:40  /  842 人查看  /  13 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 niuapp 于 2015-5-22 23:16 编辑

据说 A柱子上如果有64个盘子,把它们都移动到C柱子上时,世界就会毁灭百度百科:http://baike.baidu.com/link?url=MWuajZIEWJRoU8ndGAlDTI9OYQd_kOIaBfKDrfT2AmCrrgFJp1PRwmJwchURQXsQU72p_rHlloPjOqHZeErWn_

输出例子:---------------------------------------------
输入A柱子上盘子个数 n = 4
把编号为1的盘子从A柱子移动到B柱子
把编号为2的盘子从A柱子移动到C柱子
把编号为1的盘子从B柱子移动到C柱子
把编号为3的盘子从A柱子移动到B柱子
把编号为1的盘子从C柱子移动到A柱子
把编号为2的盘子从C柱子移动到B柱子
把编号为1的盘子从A柱子移动到B柱子
把编号为4的盘子从A柱子移动到C柱子
把编号为1的盘子从B柱子移动到C柱子
把编号为2的盘子从B柱子移动到A柱子
把编号为1的盘子从C柱子移动到A柱子
把编号为3的盘子从B柱子移动到C柱子
把编号为1的盘子从A柱子移动到B柱子
把编号为2的盘子从A柱子移动到C柱子
把编号为1的盘子从B柱子移动到C柱子
请按任意键继续. . .

---------------------------------------------


  1. /*
  2.         需求:汉诺塔,有三个柱子,A柱子上从小到大有n个盘子,要借用B柱子把A柱子上的盘子移动到C柱子,大的在下边,小的在上边

  3.         步骤:        1.先创建三个柱子
  4.                         2.输入A柱子上的盘子个数n
  5.                         3.创建一个移动盘子的方法,接受三个柱子和盘子
  6.                         4.递归
  7.                                 如果A柱子上有n个盘子,则先把 n-1 个盘子移动到B柱子,把A柱子上剩下的 第n个盘子移动到C柱子
  8.                                 B柱子上有的 n-1 个盘子,把 (n-1)-1 个盘子移动到A柱子,把B柱子上剩下的 第n-1个盘子移动到C柱子
  9.                                 ......直到A或B柱子上 只剩1个盘子,直接把它移动到C柱子,完成

  10.         总结:把大规模的东西分成两个部分,规模递减,直到把大规模的问题变成可以直接解决的问题
  11.         
  12. */

  13. import java.util.Scanner;

  14. class HanNuoTa {
  15.         public static void main(String[] args) {
  16.                 //先创建三个柱子
  17.                 char a = 'A';
  18.                 char b = 'B';
  19.                 char c = 'C';
  20.                 int n;
  21.                 Scanner sc = new Scanner(System.in);
  22.                 System.out.print("输入A柱子上盘子个数 n = ");
  23.                 n = sc.nextInt();

  24.                 move(n, a, b, c);
  25.         }

  26.         //接收  a/b/c 三个柱子(小写)目的是把a柱子上的盘子 借助b柱子 移动到c柱子
  27.         public static void move(int n, char a, char b, char c){
  28.                
  29.                 if(n==1){        //如果A柱子上只剩一个盘子,就直接把它移动到C柱子
  30.                         System.out.println("把编号为"+n+"的盘子从"+a+"柱子移动到"+c+"柱子");
  31.                 }else{
  32.                         move(n-1, a, c, b);//规模递减 先把A柱子上的 n-1 个盘子借助C移动到B
  33.                         System.out.println("把编号为"+n+"的盘子从"+a+"柱子移动到"+c+"柱子");//上边语句过后A柱子上只剩1个盘子,直接把它移动到C柱子
  34.                         move(n-1, b, a, c);//继续,把B柱子当做原先的A柱子,把B柱子上的 n-1 个盘子借助A移动到C
  35.                 }
  36.                 return;
  37.         }
  38. }
复制代码


汉诺塔.jpg (117.5 KB, 下载次数: 2)

图

评分

参与人数 1黑马币 +10 收起 理由
汤姆大叔 + 10 很给力! 瞬间长知识了。

查看全部评分

13 个回复

倒序浏览
还有这样的题,长见识了
回复 使用道具 举报
求问递归在编程上有什么实际应用?
回复 使用道具 举报
hsx500 发表于 2015-5-20 13:52
求问递归在编程上有什么实际应用?

有时候可以用那种规模递减的方法吧复杂的问题精细的问题变得稍简单和整洁?我是新人不太懂
回复 使用道具 举报
收藏学习!
回复 使用道具 举报
有一点,还是有点看不提啊明白。。
回复 使用道具 举报
不是很明白!长知识了
回复 使用道具 举报
为什么世界会毁灭?
回复 使用道具 举报
先收藏,学习一下。。。
回复 使用道具 举报
赞赞赞,顶一下
回复 使用道具 举报
谢谢分享!
回复 使用道具 举报
看着好复杂奥!
回复 使用道具 举报
啧啧!这个
回复 使用道具 举报
很好,但是界面是怎么出来的了?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马