汉诺塔问题(递归)

递归的一般解决方法: 

  1. 找出基准条件: 即为递归结束条件。(如果没有结束条件,就会出现死循环。)
  2. 思考在基准条件下,会出现什么情况。
  3. 思考基准条件前一步的情况,或函数执行情况。
  4. 配合递归公式,继续往前推
  5. 最后完善代码

 以汉诺塔为例:

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的变化。你会发现其中奥秘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值