汉诺塔的java递归实现

来源:互联网 发布:三拼域名 不值钱 编辑:程序博客网 时间:2024/06/01 08:02

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


只要记得要将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柱