经典编程题之汉诺塔"/>
经典编程题之汉诺塔
汉诺塔问题
问题描述
给定三个柱子:A,B,C
规定有n个盘子,初始时盘子全部在A柱,借助B柱将所有盘子移动到C柱即可完成,每次只能移动一个盘子,而且必须保证小盘子在大盘子上。
1、先拿三个盘子举例:
(用画图工具画的,有点丑别介意哈!☺)
分以下几步进行:
1)把绿色和粉色两个盘子借助C柱移动到B柱
2)把蓝色盘子移动到C柱
3)把绿色和粉色借助A分别移动到C柱
因此,考虑到步骤都是重复的,我们可以借助递归来解决此问题
定义一个方法,Hanoi(int n,char A,char B,char C)(n为盘子的数量)
(ps:ok,接下来看图解,目前小雪还没找到合适的工具作图,只能用画图工具来画了,残缺的柱子大家可以忽略不计,重要的是学会思想哈!雪儿尽力画了)
详细过程:
ok,大功告成!4个,5个盘子甚至更多都可以依次类推,相信大家已经看懂了,这里雪儿不在做过多的赘述。
接下来咱们一起来撸代码:
package com.xiujie.part_8;import java.util.Scanner;public class Hanoi {static int i=0;public static void main(String[] args) {Scanner scanner=new Scanner(System.in);char A='A';char B='B';char C='C';System.out.println("请输入盘子的数量");int n=scanner.nextInt();getHanoi(n, A, B, C);scanner.close();System.exit(0);}public static void getHanoi(int n,char A,char B,char C) {//一定要记得写递归出口,不然会报错if (n==1) {System.out.println("第"+(++i)+"次移动,"+A+"盘子---->"+C+"盘子");}else {getHanoi(n-1, A, C, B);System.out.println("第"+(++i)+"次移动,"+A+"盘子---->"+C+"盘子");getHanoi(n-1, B, A, C);}}
}
接下来输入3个盘子来验证我们的结果
运行结果
证明结果是正确的,ok。
个人写代码的一些小建议(大佬就不必要看了)
对于刚入门的小白来说一定要多多练习,慢慢就会写代码了,代码不是一天两天速成的,除非是天才或者数学高手,对于我这种计算机废材来说,当初学Java学的特费劲,学习一门语言不仅需要极大的耐心,而且需要勤快的双手,一定要多敲多练,不能三天打渔两天晒网(偷偷告诉你,我就是那种类型的!),当初学习的时候差点奔溃,可能当时我真的没有用心去学吧,或者大脑中没有建立计算机知识的反射弧,根本不知道为什么那样去做,这样做了能产生什么样的结果,总是以投机的方式去测试自己写的代码,别人一小时搞定我可能需要4-5个小时,费劲而且得不偿失,一定要专心去研究每一种方法的用法(我当时可能就输在专心上,千万边聊天边写,可以一心二用者除外),另外要相信自己,Everything is possible!
更多推荐
经典编程题之汉诺塔
发布评论