汉诺塔问题
Posted sp1457
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汉诺塔问题相关的知识,希望对你有一定的参考价值。
汉诺塔问题,睡觉前突然看到一个有趣的游戏——汉诺塔问题。然后我就开始思考要怎样才能建立数学模型呢?
假设只有3个圆盘: 那么问题很好解决,我们将圆盘自上而下的编号1-3 ,将柱子编号A B C :
第一步,我们将1号圆盘放到C 上 ,
第二步,我们将2号圆盘放到B 上,
第三步,将1号圆盘从C 放到B 上
第四步,将3号圆盘从A 放到C 上
第五步,将1号圆盘从B 放到A上,
第六步,将2号圆盘从B放到C上
第七步,将1号从A 放到C上。 这时候完全移动完成
也就是当n=3的时候,需要7步 (2^3-1)
假设有4个盘子呢? 得到需要15步
当 n=4 时,需要(2^4-1)
回来看假设只有一个盘子呢? 直接将1号盘子从A放到C 需要1步(2^1-1)
所以我们得到了数学模型(2^n-1)
那么怎么进行代码的实现呢?
对于这种n的数学模型,首先想到的就是递归!
是的递归,那么递归结束的条件是什么呢?很显然: 当n=1时。
那么代码要如何写?
这里分析: 三根柱子 A B C
第一步,将n-1个盘子放在缓冲柱子B上,(这时候A-->B,C起到缓冲作用)
第二步,将n号盘子从A放到C上,
第三步,将n-1个盘子放到C上(这时候B-->C,A起到缓冲作用)
package com.count.demo; import java.util.Scanner; /** * 汉诺塔问题 * @class HanoiDemo * @Description * @audtor sunpeng * @date 2018年5月4日 */ public class HanoiDemo { private static int m =0; public static void move (int n ,char from ,char to) { System.out.println("第"+(++m)+"次移动,把"+n+"号盘从"+from+"移动到"+to); } public static void hanio(int n ,char A ,char B ,char C) { if(n==1) { HanoiDemo.move(1, A, C); //System.out.println("啊哈"); }else { hanio(n-1, A, C, B); //System.out.println("balabal"); HanoiDemo.move(n, A, C); hanio(n-1, B, A, C); } } public static void main(String[] args) { char A =‘A‘; char B =‘B‘; char C =‘C‘; System.out.println("请输入圆盘的个数"); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); HanoiDemo.hanio(n, A, B, C); System.out.println("移动了"+m+"次"); scanner.close(); } }
这里通过打印来详细的观察了递归进行的顺序。
不得不说印度的神还是真的坑,这样让人搬,谁搬的完?
以上是关于汉诺塔问题的主要内容,如果未能解决你的问题,请参考以下文章