在学习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);
}
}
}
好啦,递归就给大家这几个简单例程,递归还有最经典的汉诺塔,想必大家也都知道,不懂的可以去学习学习!