# **递归算法** ## 概述 ​ 前面已经介绍了关于递归调用这样一种操作,而递归程序设计是C++语言程序设计中的一种重要的方法,它使许多复杂的问题变得简单,容易解决了。 递归特点是:函数或过程调用它自己本身。其中直接调用自己称为直接递归,而将A调用B,B以调用A的递归叫做间接递归。 ## 例题讲解 **【例1】** **给定n(n>=1),用递归的方法计算1+2+3+4+...+(n-1)+n。** 【算法分析】 本题可以用递归方法求解,其原因在于它符合递归的三个条件: 1. 本题是累加问题:当前和=前一次和+当前项,而前一次和的计算方法与其相同,只是数据不同s(n)=s(n-1)+n; 2. 给定n,所以是有限次的递归调用; 3. 结束条件是当n=1,则s=1。 ### 实现代码 ``` c++ #include using namespace std; int fac(int); //递归函数 int main() {   int t;   cin>>t; //输入t的值   cout<<"s="<A[MID]则到数据前半段查找:L不变,R=MID-1,计算新的MID值,并进行新的一段查找; 5. 若L>R都没有查找到,则输出“NO”。 该算法符合递归程序设计的基本规律,可以用递归方法设计。 ### 实现代码: ``` c++ #include #include using namespace std; int a[11]; void search(int,int,int); int main() //主程序   {     int k,x,L=1,R=10;     cout<<"输入10个从大到小顺序的数:"<>a[k];     cin>>x;     search(x,L,R);     system("pause");   }   void search(int x,int top,int bot) //二分查找递归过程   {     int mid;     if (top<=bot)    {    mid=(top+bot)/2; //求中间数的位置 if (x==a[mid]) cout<<"YES"<C; (2)当N=2时,则需要移动三次: ​ A------ 1 ------> B, A ------ 2 ------> C, B ------ 1------> C. (3)如果N=3,则具体移动步骤为: ![image-20201130171347181](https://picreso.oss-cn-beijing.aliyuncs.com/image-20201130171347181.png) ![image-20201130171403936](https://picreso.oss-cn-beijing.aliyuncs.com/image-20201130171403936.png) ![image-20201130171417273](https://picreso.oss-cn-beijing.aliyuncs.com/image-20201130171417273.png) 假设把第3步,第4步,第7步抽出来就相当于N=2的情况(把上面2片捆在一起,视为一片): ![image-20201130171457631](https://picreso.oss-cn-beijing.aliyuncs.com/image-20201130171457631.png) ​ 所以可按“N=2”的移动步骤设计: ​ ①如果N=0,则退出,即结束程序;否则继续往下执行; ​ ②用C柱作为协助过渡,将A柱上的(N-1)片移到B柱上,调用过程mov(n-1, a,b,c); ​ ③将A柱上剩下的一片直接移到C柱上; ​ ④用A柱作为协助过渡,将B柱上的(N-1)移到C柱上,调用过程mov (n-1,b,c,a)。 ### 实现代码: ``` c++ #include    using namespace std;    int k=0,n;    void mov(int n,char a,char c,char b) //用b柱作为协助过渡,将a柱上的(n)移到c柱上    {     if (n==0) return; //如果n=0,则退出,即结束程序     mov(n-1,a,b,c ); //用c柱作为协助过渡,将a柱上的(n-1)片移到b柱上     k++;     cout <"<