数据结构——递归学习和汉诺塔问题

递归

递归调用的函数调用过程:
1、保留本层参数和返回地址(将所有的实在参数、返回地址等信息传递给被调函数保存);
2、给下层参数赋值(为被调用函数的局部变量分配存储区);
3、将程序转移到被调函数的入口;
4、保存被调函数的计算结果;
5、恢复上层参数(释放被调函数的数据区);
6、依照被调函数保存的返回地址,将控制转移回调用函数;
递归问题的优点
对递归问题的描述简捷,结构清晰,程序的正确性容易证明。
递归问题的缺点
运行效率低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。

适合使用递归解决问题的情况
1、 问题具有同类同自身的子问题的性质。被定义项在定义中具有更小的尺度,即一个复杂的问题可以被分解为同类子问题,通过解决子问题从而解决总问题。

2、 被定义项在最小尺度有直接解。即问题在边界条件上可解,程序能从边界条件处退出递归执行。
设计递归算法的方法:

  1. 寻找方法,将问题化为原问题的子问题求解(例如n!=n*(n-1)!)。
  2. 设计递归出口,确定递归终止条件。

汉诺塔问题

这里写图片描述
这里写图片描述
设存在三根柱子a,b,c,盘子从上到下由小到大排序(1到n),刚开始盘子全部在a柱上
分析:
1、当n=1时,盘子直接从a柱移动到c柱;
2、当n>1时,则设法将前n-1个盘子借助c柱,先移动到b柱上,再把盘子n从a柱移动到c柱;

汉诺塔问题可分为三个子问题
1、Hanoi(n-1,x,z,y)
将x柱上的n-1个盘子借助z柱移动到y柱上,此时x柱上只剩下第n个盘子;
2、move(n,x,z);
将x柱上的第n号盘子移动到z柱上
3、Hanoi(n-1,y,x,z)
将y柱上的n-1个盘子借助x柱移动到z柱上
当n=1时,可直接求解
代码实现:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/dypnlw/article/details/81158201