递归算法基础实例

    在学习c语言的过程中递归时c语言的重点和难点。在数据结构与算法实践过程中,经常会遇到利用递归实现算法的情况,而且一般的问题都有多种解法,其中一般都递归解法的一种。

    简单来说,递归函数就是自己调用自己。而递归函数也可分为直接调用和间接调用。

下面来举几个由浅而深的例子

例一利用递归求n的阶乘。这个比较好理解,就不多说了,直接上代码。

#include<stdio.h>
long factorial(int n);  //防止数据溢出,所以定义函数用long 
int main()
{
	int n;
	printf("****************求一个数的阶乘****************\n\n"); 
	printf("请输入你要求的数:");
	scanf("%d",&n);
	printf("%d的阶乘为:%d",n,factorial(n));
}
long factorial(int n)
{
	if(n==1)
	return 1;
	else
	return n*factorial(n-1); 
}

例二:求n个数中的最大者

我们可将n个数放在一个比较大的数组中,则最大者可以通过将a[n-1]与前n-1个数的最大者相比较而得到。下面直接上代码:

#include<stdio.h>
#define N 100
int findmax(int a[],int n);
int main()
{
	int i,n,a[N];
	printf("输入你要找的数的个数: ");
	scanf("%d",&n);
	printf("\n输入这些数:\n");
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	printf("这些数中最大的数为:%d",findmax(a,n)); 
}
findmax(int a[],int n)
{
	int max;
	if(n<=1)
	return a[0];
	else
	{
		max=findmax(a,n-1);              //采用a[n-1]来与前面n-1个数的最大者来比较从而得出最大者 
		return a[n-1]>=max?a[n-1]:max;   //而前面所有数的最大者可调用此函数 
	}
}

例三:利用递归函数输出正整数和等于n的所有不增的正整数和式。例如,当n=4时,应当输出:

4=4
4=3+1
4=2+2
4=2+1+1
4=1+1+1+1 

分析:引入数组a,用来存放分解出来的和数,其中a[k]用来存放第k步分解出来的和数。则递归函数应该设置3个参数,第一个是数组名a,第二个是要分解的数,第三个是将要分解的第K个和数。则递归函数为:void rd(int a[],int i,int k);

细解还需大家自己读懂代码:

#include<stdio.h>
#define N 100
void rd(int a[],int n,int k);
int main()
{
	int n,a[N];
	printf("请输入你要分解的数:  ");
	scanf("%d",&n);
	a[0]=n;
	printf("\n%d的所有不增和式为:\n",n);
	rd(a,n,1);
}
void rd(int a[],int i,int k)
{
	int j,p;
	for(j=i;j>=1;j--)
	{
		if(j<=a[k-1])       //如果这个和数小于上一次分解的和数 
		{
			a[k]=j;
			if(j==i)       //说明已经分解完成 
			{
				printf("%d=%d",a[0],a[1]);
				for(p=2;p<=k;p++)
				printf("+%d",a[p]);
				printf("\n");
			} 
			else
			rd(a,i-j,k+1);
		}
	}
}
好啦,递归就给大家这几个简单例程,递归还有最经典的汉诺塔,想必大家也都知道,不懂的可以去学习学习!

猜你喜欢

转载自blog.csdn.net/eternal_yangyun/article/details/80958502