递归案例-汉诺塔

如果你对其他算法或者案例感兴趣,请考虑阅读我的以下文章。

递归案例-正整数划分.
递归案例-全排列.
动态规划案例-矩阵连乘(含表格填写、问题理解、实例解决).
动态规划案例-最长公共子序列(含表格填写、问题理解、实例解决、例题答案).
递归案例-电路布线(含表格填写等超详细,纯人话讲解).

问题

设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的圆盘移到塔座b上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则:

规则1:每次只能移动1个圆盘;
规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
规则3:在满足移动规则1和2的前提下,可将圆盘移至a,b,c中任一塔座上。

问题分析

1.首先令n=3,也就是一开始a柱上有三个盘子分别是1,2和3号盘子。
2.我们将操作 a上的1号盘子移动到c 记作 a1-->c

1.a1–>c
2.a2–>b
3.c1–>b
4.a3–>c
5.b1–>a
6.b2–>c
7.b1–>c
经过上面7步操作,我们成功的把1,2和3号盘子从a柱上经过b柱的帮忙下移动到了c柱上。

算法设计

为什么要用递归

递归的定义:函数调用自身。
我认为运用递归的条件就是:每一步进行的操作基本相同,并且问题规模逐渐减小。
我们可以对上面的例子进行分析:
1.前三步的操作就是将前2个盘子(也就是前n-1个盘子)经c柱从a放到b柱上。

1.a1-->c
2.a2-->b
3.c1-->b

2.第四步的操作就是将第3个盘子(也就是第n个盘子)放到c柱上。

4.a3-->c

3.将前2个盘子(也就是前n-1个盘子)经a柱从b柱放到c柱上。

5.b1-->a
6.b2-->c
7.b1-->c

递归函数参数的设计

递归函数为fun(int n,char a,char b,char c),其中n为盘子的个数,a,b,c分别为柱子。

算法分析

1.将n-1个盘子经c柱从a柱放到b柱上
2.将第n个盘子放到c柱上
3.将n-1个盘子经a柱从b柱放到c柱上

代码演示

递归函数

public static void fun(int n,char a,char b,char c)
 {
  if(n==1)
   System.out.println(a+" "+n+"--->"+c);
  else {
   fun(n-1, a, c, b);
   System.out.println(a+" "+n+"--->"+c);
   fun(n-1, b, a, c);
  }
 }

主函数调用

public static void main(String[] args) {
  fun(3, 'a', 'b', 'c');
 }

输出结果

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章