(1)显示递归(特点:数学公式)
例1:s=1+2+3+....+n;
#include <stdio.h>
int s(int n);
int main(void){
int n;
scanf("%d",&n);
printf("%d",s(n));
return 0;
}
int s(int n){
if(n==1)return 1;
return n+s(n-1);
}
例2:求Fibanacci数列第n项(1,1,2,3,5,8,,,,)
#include <stdio.h>
int fab(int n);
int main(void){
int n;
scanf("%d",&n);
printf("%d",fab(n));
return 0;
}
int fab(int n){
if(n<=2)return 1;
return fab(n-1)+fab(n-2);
}
(2)隐式递归
例1:汉诺塔问题。
#include <stdio.h>
void hanoi(int n,char a,char b,char c);
int main(void){
int n ;
scanf("%d",&n);
hanoi(n,'a','b','c');
return 0;
}
void hanoi(int n,char a,char b,char c){
if(n==0)return ;
hanoi(n-1,a,c,b);
printf("%c----->%c\n",a,c);
hanoi(n-1,b,a,c);
}
eg:字符串的长度问题。用递归方法,编写函数mylen(char *s),返回s代表的串的长度。
#include <stdio.h>
int mylen(char *s);
int main(void){
char s[]="12345";
int n=mylen(s);
printf("%d",n);
return 0;
}
//递归方法
int mylen(char *s){
if(*s=='\0') return 0;
return mylen(s+1)+1;
}
//直接法
int mylen(char *s){
char *p=s;
for(;*p!='\0';)p++;
return p-s;
}
eg:字符串的逆序问题。用递归方法,编写函数adverse(char *s),返回s代表的串的逆序。如 char *s="12345",则调用adverse(s)后,s所指的串 变为"54321"。
#include <stdio.h>
void dispadverse(char *s);
int main(void){
char s[]="12345";
char *p=s;
dispadverse(s);
for(;*p!='\0';){
printf("%c",*p++);
}
return 0;
}
//直接法
void dispadverse(char *s){
char *p,*q,t;
p=q=s;
for(;*p!='\0';)p++;
p--;
while(p>q){
t=*p,*p=*q,*q=t;
q++;
p--;
}
}
//递归法
void dispadverse(char *s){
if(*s=='\0')return ;
dispadverse(s+1);
printf("%c",*s);
}
eg:求n个数的最大(或最小值)问题。试编写函数mymax,求n个浮点数之中的最大值。mymax形式为 float mymax( float *a , int n) 其中,数组a存放n个浮点数。 要求: 1、用直接法编程; 2、用递归法编程;
#include <stdio.h>
float mymax(float *a,int n);
int main(void){
int n;
scanf("%d",&n);
float a[n],max;
for(int i=0;i<n;i++){
scanf("%f",&a[i]);
}
max=mymax(a,n);
printf("max=%f",max);
return 0;
}
//直接法
float mymax(float *a,int n){
float max=*a;
for(;*a!='\0';a++){
if(max<*a)max=*a;
}
return max;
}
float mymax(float *a,int n){
float max,t1,t2;
if(n==1)max=a[0];
else{
t1=mymax(a,n-1),t2=a[n-1];
max=(t1>t1)?t1:t2;
}
return max;
}