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

汉诺塔问题描述: 

    假设有三个命名为a(TOWER 1),b(TOWER 2),c(TOWER 3)的塔座,在塔座X上有n个直径大小各不相同,依次从小到大编号为1,2,3,…,n的圆盘。现要求将a塔座上的n个圆盘移到c塔座上并按同样顺序叠排, 

圆盘移动时必须遵循下列规则: 
1)每次只能移动一个圆盘; 
2)圆盘可以插在a,b,c中的任意塔座上; 
3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 
《【递归经典题目】汉诺塔算法 Java实现》
算法分析:

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++;
        }
	}
}
点赞