一、递归法 的基本概念
在广义表、二叉树和AVL数的算法设计中大量的用到递归法,递归算法设计需要递归数据结构和递归运算。实际上,大量的数据都是递归定义,如正整数就是这样定义的:1是正整数,如果n是正整数,则n+1也是正整数。实数是由正整数导出的,所以实数等都是递归数据结构。
递归算法通常有这样的特征:为求解规模为N的问题,设法将它分解成一些规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些更小问题的解构造出规模稍大的问题的解。特别地,当规模N=1时,能直接得到解。这样的求解算法就可用递归来描述,如后面要叙述的回溯法和分治法。
递归设计先要给出递归模型,在转换成对应的C/C++算法。由此得出递归算法的步骤如下:
①对原问题f(s)进行分析,假设出合理的“较小问题”f(s');
②假设f(s')是可解的,在此基础上确定f(s)的解,即给出f(s)与f(s')之间的关系;
③确定一个特定情况(如f(1)或f(0))的解,由此作为递归的出口。
“递归 (计算机科学) ”一词在wiki百科 中的定义如下:
在计算机编程 里,递归 指的是一个过程:函数 不断引用自身,直到引用的对象已知。
使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法。
汉诺塔问题,是常见可用递归解决的问题,不过也有非递归的解法。
菲波纳契数列 可用递归定义。
二,简单实例
例题一:用递归法求一个整数数组中所有元素的平均值。
解:设f(i)为a[0..i-1]即数组a的前i个元素的平均值。显然f(1)=a[0],假设f(i-1)即前i-1个元素的平均值已求出,则f(i)=((i-1)*f(i-1)+a[i-1])/i,由此得递归模型如下:
①f(i)=a[0] 当i=0时
②f(i)=((i-1)*f(i-1)+a[i-1])/i 当i>0时
对应的递归算法如下:
例题二:设计一个算法求出从自然数1,2,...,m中任取k个数的所有组合。
对应的递归模型如下:
①f(m,k):输出一个解 当k=1时
②f(m,k):for(i=m;i>=k;i--){a[k]=i;f(i-1,k-1)} 当k>1时
C++实现如下:
输入n,r(r<=n):4 3
输出所有组合:
4 3 2
4 3 1
4 2 1
3 2 1
请按任意键继续. . .
三,更多 实例(持续更新 )