第七章 (二)递归

 

1.递归

一个直接或间接调用自身的算法称为递归算法

一个使用自身给出定义的函数称为递归函数

 

2.应用

如果问题的数据结构是递归的(如链表),问题的定义是递归的(如fibonacci数列),问题的解法是递归的(整数划分问题),可以考虑使用递归算法

经典问题:汉诺塔问题:设有3根标号为A,B,C的柱子,在A柱上放着n个盘子,每一个都比下面的略小一点,要求把A柱上的盘子全部移到C柱上,移动的规则是:(1)一次只能移动一个盘子;(2)移动过程中大盘子不能放在小盘子上面;(3)在移动过程中盘子可以放在A,B,C的任意一个柱子上。

 总结:递归算法的执行过程是不断地自调用,直到到达递归出口才结束自调用过程;到达递归出口后,递归算法开始按最后调用的过程最先返回的次序返回;返回到最外层的调用语句时递归算法执行过程结束

递归算法既是一种有效的算法设计方法,也是一种有效的分析问题的方法。递归算法求解问题的基本思想是:对于一个较为复杂的问题,把原问题分解成若干个相对简单且类同的子问题,这样,原问题就可递推得到解。

适宜于用递归算法求解的问题的充分必要条件是:
(1)问题具有某种可借用的类同自身的子问题描述的性质;
(2)某一有限步的子问题(也称作本原问题)有直接的解存在。
当一个问题存在上述两个基本要素时,该问题的递归算法的设计方法是:
(1)把对原问题的求解设计成包含有对子问题求解的形式。
(2)设计递归出口。

 

3.递归问题的非递归表示

一般说来,递归过程的实现效率是非常低的,每次递归调用都必须首先做诸如参数替换、环境保护等事情。造成效率低下的另一个重要的原因是大量的重复计算

递归:容易堆栈溢出,并且大量的重复计算

1)设计迭代算法:如果一个函数既有递归形式的定义又有非递归的迭代形式的定义,则可以用循环结构设计出迭代算法。一般说来,如果在一个函数或过程中只递归调用它一次,那么它的计算或执行过程可以看成是线性变化的。从顶到底的再从底返回的递归可以看作从底到顶的迭代。用空间换取时间,可以进行一些空间优化。

2)尾递归

3)模拟堆栈:人工模拟就可以控制栈的大小,这个栈中保存着一些可能会丢失的信息。或者是当你不知道下一步进行到哪儿了,进行栈中的操作

 

4.递归方程解的渐近阶的求法

一些递归算法的复杂度分析可以用递推公式求得

把一个大问题分为a个子问题,子问题的规模是n/c,bn表示的是用子问题计算大问题的计算量

 

 

5.生成函数

 

我愿意称之为绝活!可以看出来这个玩意可以很好的求通项公式

 

 

 

 

posted @ 2020-03-18 15:30  小帆敲代码  阅读(442)  评论(0编辑  收藏  举报