博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2_1_6 递归与分治策略(汉诺塔问题)
阅读量:6992 次
发布时间:2019-06-27

本文共 969 字,大约阅读时间需要 3 分钟。

汉诺塔问题是一个经典问题。

题意理解:有A,B,C三个柱子,将A柱子上的N个盘子(从小到大排列)移到C柱子上,每次只允许移动一个盘子,并且保证每个柱子上的盘子的排列都是从小到大。

(图片源自百度图片)

分析:由题意可知,如果要将A上的盘子移动到C,那么肯定需要借助C。

首先将A上的盘子从上到下依次编号为1-n。

运用整体思想:

  1、假设1到n-1个盘子是一个整体

  2、将1到n-1个盘子构成的整体移动到B

  3、将第n个盘子移动到C

  4、再将第2步移动到B的整体移动到C就可以了。

  重复以上过程,显然这是一个递归的过程。下面给出代码。

1 public class a2_1_6 { 2     static void Hanoi(int n,char A,char B,char C)  //将A上的盘子移动到C 3     { 4         if(n>0){ 5             Hanoi(n-1,A,C,B);  //1、将A上1到n-1个盘子移动到B 6             move(A,C);//2、将A最下面那个第n个盘子移动到C 7             Hanoi(n-1,B,A,C);  //3、将B上的1到n-1个盘子移动到C 8         } 9     }10 11     private static void move(char a, char b) {12         System.out.println(a+"-> "+b);   //第二步,将A上剩余的一个盘移到C;13     }14 15     public static void main(String args[]){16         Hanoi(4,'A','B','C');17     }18 }

 

结果大概这么回事:

递归写代码很简洁,但是很容易写错,写错基本就StackOverflowError了,然后递归也比较抽象,不是那么容易理解。所以我的原则是可以不用递归尽量不用,后面有时间找找非递归版本的汉诺塔。本人学渣,不足之处,望各位大佬指正,谢谢!

 

转载于:https://www.cnblogs.com/woyaodangxueba/p/10453067.html

你可能感兴趣的文章
完成构建之法第二章后面的小实践~
查看>>
java中的继承(二)
查看>>
课后作业-阅读任务-阅读提问-3
查看>>
坑爹的 ld: symbol(s) not found for architecture armv7
查看>>
Help Jimmy 递推动规
查看>>
Kali渗透测试——netdiscover
查看>>
数据结构之拓扑排序
查看>>
Java基本语法(一)
查看>>
zedboard 初使用 -- 工具篇
查看>>
关于Spring出现"COMMIT/AUTO or remove 'readOnly' marker from transaction definition."的解决办法...
查看>>
web请求报出 “超过了最大请求长度”
查看>>
Java中构造方法、实例方法、类方法的区别
查看>>
字节流转换为对象的方法
查看>>
2018-2019-1 20165226 《信息安全系统设计基础》第1周学习总结
查看>>
BZOJ2743:[HEOI2012]采花——题解
查看>>
android webview 视频相关
查看>>
oracle数据集合的操作
查看>>
[转] word2vec
查看>>
欧洲大陆
查看>>
基于Java反射的map自动装配JavaBean工具类设计
查看>>