首页 > 学院 > 开发设计 > 正文

蓝桥杯——递归二:典型递归模型(2017.2.20)

2019-11-08 01:43:42
字体:
来源:转载
供稿:网友

1. 递归法实现折半查找

源代码:

法一:

#include <stdio.h>#define maxn 1010int Find(int a[],int k,int low,int high){	int i,mid;	if(low>high)		i=-1;	else	{		mid=(low+high)/2;		if(a[mid]==k)			i=mid;		else if(a[mid]<k)			i=Find(a,k,mid+1,high);		else			i=Find(a,k,low,mid-1);	}	return i;}int main(){	int a[maxn];	int i,n,k;	int low,high,index;	while(scanf("%d",&n)!=EOF)	{		for(i=0;i<n;i++)			scanf("%d",&a[i]);		scanf("%d",&k);		low=0,high=n-1;		index=Find(a,k,low,high);		if(index>=0)			PRintf("%d/n",index+1);		else			printf("Not found!/n");	}	return 0;}法二:

#include <stdio.h>#define maxn 1010void Find(int a[],int k,int low,int high){	int i,mid;	if(low>high)		printf("Not found!/n");	else	{		mid=(low+high)/2;		if(a[mid]==k)			printf("%d/n",mid+1);		else if(a[mid]<k)			Find(a,k,mid+1,high);		else			Find(a,k,low,mid-1);	}}int main(){	int a[maxn];	int i,n,k;	int low,high,index;	while(scanf("%d",&n)!=EOF)	{		for(i=0;i<n;i++)			scanf("%d",&a[i]);		scanf("%d",&k);		low=0,high=n-1;		Find(a,k,low,high);	}	return 0;}程序截图:

2. 递归法求Fibonacci数列的第n项,其中1<=n<=40

源代码:

#include <stdio.h>#define maxn 1010int fib(int n){	if(n==1 || n==2)		return 1;	else		return fib(n-1)+fib(n-2);}int main(){	int i,n;	while(scanf("%d",&n)!=EOF)		printf("fib(%d)=%d/n",n,fib(n));	return 0;}程序截图:

3. 汉诺塔问题

源代码:

#include <stdio.h>int step=0;void print(char x,char y){	printf("%c->%c/n",x,y);	step++; }void move(int n,char s1,char s2,char s3)    //s1-起点 s2-经过的柱 s3-终点 {	int step=0;	if(n==1)		print(s1,s3);	else	{		move(n-1,s1,s3,s2);		print(s1,s3);		move(n-1,s2,s1,s3);	}}int main(){	int n;	while(scanf("%d",&n)!=EOF)	{		move(n,'A','B','C');                //将n个盘子从A柱移到C柱		printf("step=%d/n",step);		step=0;	}	return 0;}程序截图:

4. 几种排序算法的递归实现

(1)冒泡排序

源代码:

#include <stdio.h>#include <string.h>#define maxn 1010void bubblesort(int a[],int start,int end){	int i,t;	if(start<=end)	{		for(i=start;i<end;i++)		{			if(a[i]<a[i+1])			{				t=a[i];				a[i]=a[i+1];				a[i+1]=t;			}		}		printf("%d ",a[end]);		end--;		bubblesort(a,start,end);	}}int main(){	int i,n,a[maxn]={0};	int start,end;	while(scanf("%d",&n)!=EOF)	{		for(i=0;i<n;i++)			scanf("%d",&a[i]);		start=0,end=n-1;		bubblesort(a,start,end);		printf("/n");		memset(a,0,sizeof(n));	}	return 0;}程序截图:

(2)选择排序

源代码:

#include <stdio.h>#define maxn 1010void SelectSort(int a[],int start,int end){	int i,j,k;	int t,index;	if(start<end)	{		t=a[start];		index=start;		for(i=start+1;i<end+1;i++)		{			if(a[index]>a[i])				index=i;		}		if(start!=index)		{			t=a[start];			a[start]=a[index];			a[index]=t;		}		start++;		SelectSort(a,start,end);	}}int main(){	int n,a[maxn];	int i,start,end;	while(scanf("%d",&n)!=EOF)	{		for(i=0;i<n;i++)			scanf("%d",&a[i]);		start=0,end=n-1;		SelectSort(a,start,end);		for(i=0;i<n;i++)			printf("%d ",a[i]);		printf("/n");	}	return 0;}程序截图:

(3)快速排序

源代码:

#include <stdio.h>#define maxn 1010void Quicksort(int a[],int left,int right){	int i=left,j=right;	int tmp;	if(left<right)	{		tmp=a[left];		while(i!=j)		{			while(j>i && a[j]>=tmp)				j--;			a[i]=a[j];			while(i<j && a[i]<=tmp)				i++;			a[j]=a[i];		}		a[i]=tmp;		Quicksort(a,left,i-1);		Quicksort(a,i+1,right);	}}int main(){	int i,n,left,right;	int a[maxn];	while(scanf("%d",&n)!=EOF)	{		for(i=0;i<n;i++)			scanf("%d",&a[i]);		left=0,right=n-1;		Quicksort(a,left,right);		for(i=0;i<n;i++)			printf("%d ",a[i]);		printf("/n");	}	return 0;}程序截图:

5. 递归打印杨辉三角形

源代码:

#include <stdio.h>int fun(int x,int y){	if(y==0 || y==x)		return 1;	else		return (fun(x-1,y-1)+fun(x-1,y));}int main(){	int i,j,n;	while(scanf("%d",&n)!=EOF)	{		for(i=0;i<n;i++)		{			for(j=0;j<=i;j++)				printf("%4d",fun(i,j));			printf("/n");		}	}	return 0;}程序截图:

附各题思路分析及要点整理:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表