递归的一般解决方法:
- 找出基准条件: 即为递归结束条件。(如果没有结束条件,就会出现死循环。)
- 思考在基准条件下,会出现什么情况。
- 思考基准条件前一步的情况,或函数执行情况。
- 配合递归公式,继续往前推
- 最后完善代码
以汉诺塔为例:
1.终止条件为:当n等于1的时候。就只有一块的时候就不能再递归调用了。
2.此时,只需要将该块从所在位置(a) 移动到目标位置(c)
3.当有两块的时候。
需要先把第一块移动到中转位置(b)
再把第二块移动到目标位置(c)
最后把第一块从中转位置移动到目标位置。
4.于是推出递推公式:
第一步:把n-1块汉诺塔移动到中转位置
第二步:把第n个汉诺塔移动到目标位置
第三步:把第n-1个汉诺塔再从中转位置移动到目标位置
5.代码如下:
public class Recursive {
public static void hannota (int n,char a1,char b1,char c1) //a b c分别代表从左到右的三个柱子
{
if(n==1){
int begin=a1; 我们这里生命两个变量观察输出参数的变化。
int last=c1;
System.out.println("第"+n+"个元素从"+a1+"移动到"+c1);
}
else{
hannota(n-1,a1,c1,b1); //第一步:将n-1个数汉诺塔移动到中间的b柱子过渡
System.out.println("第"+n+"个元素从"+a1+"移动到"+c1); //第二步:将最下面第n个元素从a移动到c
hannota(n-1,b1,a1,c1); //第三步:将n-1个元素从b柱子以a柱子为过渡,移动到c柱子
}
}
public static void main(String[] args) {
int num=3; //代表汉诺塔总数
char a='a'; //分别代表不同的柱子
char b='b';
char c='c';
hannota(num,a,b,c);
}
在这里我遇到的最大问题是:
我们是通过输出参数的形式进行步骤记录。
System.out.println("第"+n+"个元素从"+a1+"移动到"+c1);
为什么输出一直是参数a1,c1,但是会出现一个参数而输出的值一直在变。
传到函数里面的参数是怎么变化的?
那就说明参数的值在变。至于具体过程为什么会变,那就请看下面调试代码。
我在终止条件哪里设置了两个变量用于存放输出变量的值。观察其变化。
int begin=a1; 我们这里生命两个变量观察输出参数的变化。
int last=c1;
设置n=3,代码从第12行开始调试
观察a1,b1,c1,begin ,last的变化。你会发现其中奥秘