程序设计基础--递归

(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;
} 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值