递归算法实例C源码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
玩转算法与数据结构之递归算法
—HIT2000鲁天伟
递归算法在数据结构的树,图程序中都有应用。那么什么是递归算法呢。其实就是函数的自我调用。循环的在作一件事,把一个问题分成了可以重复的子问题去处理。递归这个词有两层含义,即递去和归来。递去,就是函数一层一层的在调用自己,我们在这里定义调用自己的函数为父函数,被调用的是子函数。父与子是个相对概念(参照二叉树中父结点与子结点来理解)。递去,何时结束呢,是要设定一个结束条件。那么这种结束条件的设置,第一种是设全局变量,全局变量随着每次自我调用在变化,当全局变量达到指定值或是全局变量参与的计算达到某个指定的值时结束。第二种是形参变量在被调用时达到指定值或形参参与的计算达到某个值时结束。第三种是当不满足自我调用条件时结束。这三种结束条件结合程序的需要可以组合使用。归来是指调用到某一次时,子程序执行结束了,子函数一层一层的把程序的执行权返还给自己的父函数,父函数执行所调用子函数的下一条命令。简单的递归,是一个函数体中调用自己一次,复杂的是在函数体中调用自己多次。
举一个字符串逆序输出的简单递归调用的例子如下图。
图表 1 递归函数调用
1、字符串逆序输出问题:将一个长为4的字符串逆序输出。代码如下:
#include
#define MAXSIZE 4
char data[MAXSIZE];
Rverse(int n){
if(n Rverse(n+1); printf("%c",data[n]); } } void main(){ printf("Input %d letters”,MAXSIZE); gets(data); Rverse(0); getch(); } 上面这段代码完成了,长度为4的任意字符串的逆序输出。由于打印的语句在递归函数自我调用之后,所以打印是在归来时开始的,从后向前打印。那如果把上面代码中标红的两句代码上下换个位置,那么就是正序打印了,也就是在递归函数自我调用之前打印,在递去的过程中打印。递去过程中正序打印,归来过程中是逆序打印。 正序打印递归调用如下: Rverse(int n){ if(n printf("%c",data[n]); Rverse(n+1); } } 修改成如下while循环代码 Rverse(int n){ while(n printf("%c",data[n]); n=n+1; } } 上述两段代码执行效果相同。 2、斐波那契级数问题 求解F(n)=F(n-1)+F(n-2); n>=3,F(1)=1,F(2)=1 代码如下: #include int Fib(int N){ if(N<=1) return N; else return Fib(N-1)+Fib(N-2); } int n; int result; do{ printf("Input n ,if you want to quit please input -1\n"); scanf("%d",&n); if(n==-1) break; result=Fib(n); printf("Fib(%d) is %d\n",n,result); }while(1); getch(); } 3、阶乘问题:N!=N*(N-1)! 1!=1 代码如下: #include int NJ(int n){ if(n==1) return1; else{ return n*NJ(n-1); } } void main(){ int n; int result; do{ printf("Input n you want to caculate n!,Input -1 to quit\n"); scanf("%d",&n); if(n==-1) break; result=NJ(n); printf("%d! is %d\n",n,result); }while(1); getch(); } 4、乘法运算:M*N=M*(N-1)N=1时返回M 代码如下: #include int Multiply(int M,int N){ if(N==1) return M; else return M+Multiply(M,N-1); } int M,N; int a; int result; do{ printf("Pleaese input the data you want to Multiply format:M N.If quit input -1 -1\n"); scanf("%d %d",&M,&N); result=Multiply(M,N); if(M==-1) break; printf("%d * %d is %d\n",M,N,result); }while(1); getch(); } 5、组合的计算,从m个物品中选出n个物品有几种选法C n m=C n m-1+C n-1 m-1m>=n n>=0 #include int zuhe(int m,int n){ if(m==n || n==0) return1; else return zuhe(m-1,n)+zuhe(m-1,n-1); } void main(){ int m,n; int result; do{ printf("Please input format:m n ;(m>=n) if you want to quit input -1 -1 \n"); scanf("%d %d",&m,&n); if(m==-1) break; else if(m continue; } else{ result=zuhe(m,n); printf("C %d %d is %d\n",m,n,result); } }while(1); getch(); }