汉诺塔问题-递归

最近看了一下递归的经典问题汉诺塔问题,并且自己用java实现了一下。
首先我们来看一下问题的描述:设 a b c 是三个塔座。开始时,在a塔上有一叠共n个圆盘,这些圆盘自上而下,由小到大的叠放在一起,个圆盘从小到大的编号为1,2,3…n,如图,现要求将塔座a上的所有圆盘都移动到塔座b上,并仍按同样的顺序叠置。在移动圆盘时应该遵循以下移动规则:
规则(1)每次只能移动一个圆盘。
规则(2)任何时刻都不允许将较大的圆盘压在较小的圆盘之上。
规则(3)在满足移动规则(1)和(2)的前提下,可将圆盘,移至a,b,c中任意一塔。
在这里插入图片描述
问题分析:首先将n个盘子分为两部分上层的n-1个盘子和最下层的一个最大的盘子,想要将n个盘子都移到b上,就需要先将上层的n-1个盘子都移动到c上,然后将最下层的一个盘子移动到b上,最后再将n-1个盘子从c移动到b,那么问题来了,如何把n-1个盘子从a移动到c再将从c移动到b呢,到这里仔细想我们就会发现,其实这两个问题就是和原问题相同的问题,只是问题的规模变小了1,所以说相同的问题就可以采用相同的方法,依然按照n规模的解法解决n-1的问题,这也就是递归的思想,自己调用自己,将一个规模较大的问题逐层分解,但是分解后的问题都是与原问题相同的问题,一直分解到问题可以直接解决,比如说本问题到什么时候是可以直接解决的?当然是当n=1的时候。下面就是汉诺塔问题的java实现,

//这是经典的递归问题汉诺塔的java实现将a上的n个盘子移动到b盘子上,而c作为中间介
public class Hanoi {
	public static void main(String[] args){
		hanoi(3,'a','b','c');
	}
	public static void hanoi(int n,char a,char b,char c) {
		if(n>0) {
			hanoi(n-1,a,c,b);//第一步将上层n-1个盘子从a移动到c
			System.out.println(String.format("将盘子从%s移动到%s",a,b));//第二步将最下层的一个盘子从a移动到b
			hanoi(n-1,c,b,a);//第一步将上层n-1个盘子从c移动到b
		}
	}
}

运行结果(n=3):
将盘子从a移动到b
将盘子从a移动到c
将盘子从b移动到c
将盘子从a移动到b
将盘子从c移动到a
将盘子从c移动到b
将盘子从a移动到b
思考:由汉诺塔问题我们就可以想到,当一个问题的规模小到一定程度可以直接解决,并且这个问题可以化为较小规模的问题时,就可以考虑使用递归,递归的神奇就像是一种自我救赎。递归的难点在于,仔细想越想越乱。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值