【递归经典题目】汉诺塔算法 Java实现

来源:互联网 发布:神器挂机软件 编辑:程序博客网 时间:2024/05/18 17:02
汉诺塔问题描述: 
   假设有三个命名为a(TOWER 1),b(TOWER 2),c(TOWER 3)的塔座,在塔座X上有n个直径大小各不相同,依次从小到大编号为1,2,3,...,n的圆盘。现要求将a塔座上的n个圆盘移到c塔座上并按同样顺序叠排, 
圆盘移动时必须遵循下列规则: 
1)每次只能移动一个圆盘; 
2)圆盘可以插在a,b,c中的任意塔座上; 
3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 
算法分析:
1.当n=1时,移动方式: a->c
2.当n=2时,移动方式:    a->b, a->c, b->c
3.当n=3时, 移动方式:  我们需要把上面两个2,借助c塔,移动到b塔上,然后把a塔的最大的盘移动到c塔,再借助a塔把b塔的两个盘移动到c塔(调用f(2)函数)

import java.util.Scanner;public class Hanoi {static long s = 0;public static void main(String args[]) {int n = 0;Scanner console = new Scanner(System.in);n = console.nextInt();System.out.println("汉诺塔层数为" + n);System.out.println("移动方案为:");hanoi(n, 'a', 'b', 'c');System.out.println("需要移动次数:" + s);}static void hanoi(int n, char a, char b, char c) { //a为初始塔,b为中间塔,c为目标塔if (n == 1){              System.out.println("n=" + n + " " + a + "-->" + c);              s++;        }else{              /*递归的调用*/              hanoi(n-1,a,c,b);              System.out.println("n=" + n + " " + a + "-->" + c);              hanoi(n-1,b,a,c);              s++;        }}}


0 0