汉诺塔的java递归实现

别用脑袋去想如何一步一步移动,因为人脑内存比较小,而且不适合栈操作,压着压着就忘了。特别是对于这种头递归,要记递归完了之后该继续哪些操作。


只要记得要将n个盘从A移到C的方法是:

1)如果n==1(只有1个盘),直接将其从A移到C即可,否则

2)将n-1个盘从A移借助C到B

3)将第n个盘从A移到C

4)再将n-1个盘从B移借助A到C

移动多个盘时都需要借助第三方柱子,并且跟原始问题只有规模不同,调用自身。

那么再问,将n个盘从A移到C要移动多少次呢?

设移动n个盘需要f(n)次,则有: f(n) = f(n-1) + 1 + f(n-1) = 2f(n-1) + 1, n>=2,f(1) = 1

这是一个通项公式,

可得, f(n) +1 = 2(f(n-1) + 1)

则,[f(n) +1]/[f(n-1) + 1] = 2

f(n) + 1是一个等比数列

f(n)   = 2^n - 1


代码:

public class Hanoi {

	public static void main(String[] args) {
		Hanoi h = new Hanoi();
		h.solve(3, "a柱", "b柱", "c柱");
	}
	public void solve(int n, String src, String transfer, String dst) {
		if(n == 1) {
			move(n, src, dst);
		} else {
			solve(n-1, src, dst, transfer);
			move(n, src, dst);
			solve(n-1, transfer, src, dst);
		}
	}
	public void move(int n, String src, String dst) {
		System.out.println(n + " " + src + " -----> " + dst);
	}

}
输出:

1 a柱 -----> c柱
2 a柱 -----> b柱
1 c柱 -----> b柱
3 a柱 -----> c柱
1 b柱 -----> a柱
2 b柱 -----> c柱
1 a柱 -----> c柱



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值