递归问题初尝试
递归
递归,简单来说,是一种函数调用自身的算法
递归的应用
递归可以用在一个很古老的问题——汉诺塔问题上。
汉诺塔问题:
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘
汉诺塔问题的分析
三根柱子 A ,B ,C ,假设有n=3个盘子,需要将所有的盘子从A移到C
第一个盘子【1】:A–>C
第二个盘子【2】:A–>B
第一个盘子【1】:C–>B
第三个盘子【3】:A–>C
第一个盘子【1】:B–>A
第二个盘子【2】: B–>C
第一个盘子【1】:A–>C
经过类似的讨论,我们发现,盘子的移动方式为:
1.n-1个盘子的途径为A–>C–>B
2.第n个盘子的路径为A–>C
3.n-1个盘子的路径为B–>A–>C
利用递归,调用自身函数,实现此方式
汉诺塔问题的代码尝试
定义一个函数hannuota,在此函数中调用自身
递归函数
- public static void hnt(int n,char A ,char B,char C)
{
if (n == 1)
{
move(n,A,C); // 直接将盘子从A–>C
}
else
{
hnt(n-1,A,C,B)
}
这里进入递归函数之后不断调用自身,例如,n=2,调用后进入else,实行n-1,A–>C–>B(移动但是不显示),然后进入if,进入Move函数
A、B、C的位置是不变的,可以看成三根柱子。这里的变换可以看成a、b、c字母位置的变换
完整程序为
package my;
public class Hannuota
{
// TODO Auto-generated method stub
public static void hnt(int n, char A, char B, char C)
{
if (n == 1)
{
move(n,A,C); // 直接将盘子从A-->C
}
else
{
hnt(n - 1, A, C, B);
//将n-1个盘子由A经过C移动到B,这里为递归,自身调用
move(n,A,C); //执行最大盘子n移动
hnt(n - 1, B, A, C);
//剩下的n-1盘子,由B经过A移动到C
}
}
public static void move(int n,char x, char y)
{
//执行最大盘子n的从A-C的移动
System.out.println("把编号为["+n+"]盘从"+x+" 移动到 "+y);
}
public static void main(String[] args)
{
System.out.println("请输入盘子的个数n: ");
Scanner scanner = new Scanner(System.in);
//声明输入变量sanner并初始化;
int n = scanner.nextInt();
//将输入的变量sanner的值赋给整数变量 n
System.out.println("移动汉诺塔的步骤:");
hnt(n, 'A', 'B', 'C');
}
}