深入了解和掌握递归问题是一个高效程序员的基本素养,无论在平时课程学习或者竞赛中,递归思想的地位举足轻重,故在此对一些经典递归问题进行一些总结。(1)计算一个数组中元素的累加和#include<stdio.h>intaddAll(inta[],intbegin,intend);intmain(){inta[6]={3,5,1,6,34,67};intsum=0;//计算a数组的累加和sum=addAll(a,0,5);printf("%d\n",sum);}intaddAll(inta[],intbegin,intend){if(begin==end){returna[begin];}intmid=(begin+end)/2;intsum=addAll(a,begin,mid)+addAll(a,mid+1,end);returnsum;}(2)比较两个数组中元素是否完全相同#include<stdio.h>boolstrcomp(charstr1[],charstr2[],intlength,intbegin);intmain(){charstr1[10]="hello",str2[10]="hewlo";//比较两个数组是否相同printf("%d\n",strcomp(str1,str2,5,0));}boolstrcomp(charstr1[],charstr2[],intlength,intbegin){if(begin==length){returntrue;}else{if(str1[begin]!=str2[begin]){returnfalse;}returnstrcomp(str1,str2,length,begin+1);}}(3)从n个球中取出m个,一共有多少可能性#include<stdio.h>intselect(intn,intm);intmain(){//从n个球中取出m个不同的球,一共有多少种可能性printf("从5个球里取出2个球的可能性:%d\n",select(5,2));}intselect(intn,intm){if(m==0){return1;}if(m>n){return0;}if(n==m){return1;}returnselect(n-1,m-1)+select(n-1,m);}(4)求两个字符串的最大公共子序列#include<stdio.h>#include<math.h>#defineN100intmaxSubsequence(charstr1[],charstr2[],intbegin1,intbegin2);intmax(inta,intb);intmain(){charstr1[N];charstr2[N];intmax;scanf("%s%s",str1,str2);max=maxSubsequence(str1,str2,0,0);printf("两个字符串的最大公共子序列为:%d\n",max);return0;}intmaxSubsequence(charstr1[],charstr2[],intbegin1,intbegin2){if(str1[begin1]=='\0'||str2[begin2]=='\0'){return0;}if(str1[begin1]==str2[begin2]){returnmaxSubsequence(str1,str2,begin1+1,begin2+1)+1;}else{returnmax(maxSubsequence(str1,str2,begin1+1,begin2),maxSubsequence(str1,str2,begin1,begin2+1));}}intmax(inta,intb){returna>b?a:b;}(5)杨辉三角求第m层第n项的元素#include<stdio.h>intyanghuiTriangle(intm,intn);intmain(){intm,n;//m为层数(从0开始),n为第n项(从0开始)intvalue;scanf("%d%d",&m,&n);value=yanghuiTriangle(m,n);printf("%d",value);}intyanghuiTriangle(intm,intn){if(m==0)return1;if(n==0)return1;if(n==m)return1;if(n>m)return-1;returnyanghuiTriangle(m-1,n-1)+yanghuiTriangle(m-1,n);}(6)求两个数的最小公倍数#include<stdio.h>intgcd(inta,intb);intmain(){inta=9,b=4;printf("a和b的最大公约数为:%d\n",gcd(a,b));}intgcd(inta,intb){if(a==0)returnb;/*递归结束条件*/returngcd(b%a,a);}(7)递归求一个数的n次幂#include<stdio.h>longlongpow(inta,intb);intmain(){inta=3,b=3;printf("%d的%d次幂为:%d\n",a,b,pow(a,b));}longlongpow(inta,intb){if(b%2==1)returna*pow(a,b-1);if(b==0)return1;returnpow(a*a,b/2);}