【递归经典题目】汉诺塔算法 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)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 
算法分析:
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++;
        }
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值