您的位置:首页 > 其它

算法基础:递归---汉诺塔问题

2016-03-13 22:40 459 查看
递归算法:
一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的能力在于用有限的语句来定义对象的无限集合。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

/*
*  Hanio塔问题
*  设abc是三个塔,开始时,a塔上一共叠有n个圆盘,自上而下由大到小的叠在一起。各圆盘从小到大编号为1到n。
*  现要求将塔a的一叠圆盘移到塔b上,并按照同样的顺序叠置,并且在移动过程中遵守一下规则:
*  1.每次只能移动一个圆盘
*  2.任何时刻都不允许将较大的圆盘压在较小的圆盘之上
*  3.在满足12的前提下可以任意将圆盘移动到abc任何一个上
*  在程序最初输入一个给定的n, 程序末尾输出一个由n确定的移动次数count;
*/

/*
* 思路:
*     Hanio(n,a,b,c)表示将塔自上而下,由大到小叠在一起的n个圆盘依照移动规则移至塔b上并且按照同样顺序叠排。
* 移动过程中,以c为辅助塔, move(n,a,b)表示将塔a上编号为n的圆盘移至塔b上
*/

import java.util.Scanner;

public class Digui {

//自上而下从小到大将a上的所有圆盘全部移动到b上
void hanio(int x, char a, char b, char c) {
if (x == 1){
move(x, a, b);
}
else {
hanio(x - 1, a, c, b);  //将n-1个圆盘由a放到c上
move(x, a, b);      //再将第n个圆盘由a放在b上
hanio(x - 1, c, b, a);   //最后讲放在c上的n-1个圆盘放到b上
}
}

//将i上编号为n的圆盘移动到j上
void move(int x,char i,char j){
System.out.printf("将第%d个圆盘由%c移动到%c"+"\n",x,i,j);
}

public static void main(String args[]) {

Scanner input = new Scanner(System.in);

int n;

Digui han = new Digui();

System.out.println("请输入第一个塔a上一共有多少个圆盘?");
n = input.nextInt();

han.hanio(n,'a','b','c');
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: