汉诺塔java递归解法浅析

来源:互联网 发布:法语助手软件过期 编辑:程序博客网 时间:2024/06/06 19:18

汉诺塔java递归解法浅析

问题描述

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

 

java递归核心代码实现

1. public static voiddoTowers(int topN,char from,charinter,char to) {

2.           if (topN== 1) {

3.                  System.out.println("Disk" +topN +"from " +from +"to " +to);

4.           }else {

5.                  doTowers(topN- 1, from, to, inter);

6.                  System.out.println("Disk" +topN +"from " +from +"to " +to);

7.                  doTowers(topN- 1, inter, from, to);

8.           }

9.    }

递归逻辑

         递归算法相对来讲还是比较难以理解的,尤其是初学时不了解递归算法的具体运算过程,很容易一头雾水,不清楚结果的来由。

        

         解法整体逻辑:

         假设圆盘有topN个,起点 from,终点 to, 中介 inter.

        

1.      如果topN==1,只有一个盘,直接移到目的柱。

2.      Else 将起点柱的topN-1 圆盘通过终点柱移动到中介柱上。

将起点柱上的第topN个圆盘移动到目的盘上。

将中介柱上的topN-1 圆盘通过起点柱移动到终点柱上。

 

 

详细分析

分析圆盘数为3的情况。

        

         From= A,inter = B,to = C;

 

doTowers(3,from,inter,to)(1);

1.      进入else块,执行第5行代码,doTowers(2,from,to,inter)(11);

         a)        进入else块,执行第5行代码,doTowers(1,from,inter,to)(111);

                                      i.             进入if块,执行第3行代码,disk 1 from A to C(1111);此时递归函数返回,即doTowers(1,from,inter,to)(111)运算结束;第一步完成。

        b)        topN = 2时的第6行代码,disk 2from A to B(111);第二步完成。

        c)        执行第7行代码doTowers(1,to,from,inter)(111);

                                      i.             进入if块,执行第三行代码,disk 1 from C to B(111);递归函数返回,即doTowers(1,to,from,inter)(111)运算结束;第三步完成。

2.      执行 topN = 3 时的第6行代码,disk 3 from A to C(11);第四步完成。

3.      执行第7行代码doTowers(2,inter,from,to)(11);

      a)        进入else块,执行第5行代码,doTowers(1,inter ,to, from)(111);

                                      i.             进入if块,执行第3行代码,disk 1 from B to A(1111);此时递归函数返回,即doTowers(1,inter ,to, from)(111)运算结束;第五步完成。

     b)        topN = 2时的第6行代码,disk 2from B to C(111);第六步完成。

     c)        执行第7行代码doTowers(1,from,inter,to)(111);

                                      i.             进入if块,执行第3行代码,disk 1 from A to C(1111);此时递归函数返回,即doTowers(1,from,inter,to)(111)运算结束;第七步完成。

 

 

以上为代码的单步运行结果,根据缩进可以看出递归的运行情况。

完整代码

import java.util.Scanner;public class Main {public static void main(String[] args) {System.out.println("Enter disks number:");int nDisks = new Scanner(System.in).nextInt();doTowers(nDisks, 'A', 'B', 'C');}public static void doTowers(int topN, char from, char inter, char to) {if (topN == 1) {System.out.println("Disk " + topN + " from " + from + " to " + to);} else {doTowers(topN - 1, from, to, inter);System.out.println("Disk " + topN + " from " + from + " to " + to);doTowers(topN - 1, inter, from, to);}}}




0 0
原创粉丝点击