C语言实现递归算法
递归算法是运用于函数调用中的。
递归的概念:在一个函数体内调用自身称为函数的递归调用。
递归调用的原理:需要在函数内满足一定的条件后不在调用自身或者结束,或者调用其它函数,否则容易出现类似死循环的情况,程序将瘫痪。
已知f(1) = 1,f(0) = 0,fn(n) = f(n-1) + f(n-2),求f(5)为多少?
第一步,把5带入递归公式中得到f(5) = f(4) + f(3),此时f(4)以及f(3)仍然属于未知,必须继续求f(4)和f(3)。
第二步,把4带入递归公式中得到f(4) = f(3) + f(2)。
第三步,把3带入递归公式中等到f(3) = f(2) + f(1)。
第四步,把2带入递归公式中得到f(2) = f(1) + f(0)。
第五步,此时f(0)和f(1)都是已知的,然后下一步将它们一级一级代入到以上的公式中,逐一求出f(2),f(3),(4),最后求出结果f(5)。
求阶乘n! = n*(n-1)*(n-2)*...*2*1。
首先定义最终终止条件f(1) = 1。
然后定义递归公式f(n) = f (n)*f(n-1) 。
#include<stdio.h>
int fn(int a);
void main()
{
int sum;
sum = fn(3);
printf("%d/n",sum);
}
{
int sum;
sum = fn(3);
printf("%d/n",sum);
}
int fn(int a)
{
if(a == 1)
{
return 1;
}
else
{
a = a*fn(a-1);
return a;
}
{
if(a == 1)
{
return 1;
}
else
{
a = a*fn(a-1);
return a;
}
}
斐波那契数列是第一和第二个数都为1,后面的数都是前两个数相加的和得到的。如(1,1,2,3,5,…)求斐波那契数列的前10个数。
首先定义最终终止条件f(1)=1,f(2)=1;
然后定义递归公式中f(n)=f(n-1)+f(n-2)。
#include<stdio.h>
int fn(int a);
void main()
{
int sum;
sum = fn(7);
printf("%d",sum);
}
{
int sum;
sum = fn(7);
printf("%d",sum);
}
int fn(int a)
{
if(a<=2 && a>0)
{
return 1;
}
else if(a>2)
{
a = fn(a-1) +fn(a-2);
return a;
}
}
{
if(a<=2 && a>0)
{
return 1;
}
else if(a>2)
{
a = fn(a-1) +fn(a-2);
return a;
}
}
有一个农场在第一年的时候买了一头刚出生牛,这头牛在第四年的时候就能生一头小牛,以后每年这头牛就会生一头小牛。这些小牛成长到第四牛又会生小牛,以后每年同样会生一头牛,假设牛不死,如此反复。请问50年后,这个农场会有多少头牛?
首先定义最终终止条件f(4)=1;
然后定义递归公式中f(n)=f(n-1)+f(n-3)。
#include<stdio.h>
int fn(int a);
void main()
{
int i;
i = fn(20);
printf("%d/n",i);
}
{
int i;
i = fn(20);
printf("%d/n",i);
}
int fn(int a)
{
if (a<4 && a>0)
{
return 1;
}
else if(a>=4)
{
a = fn(a-1) + fn(a-3);
return a;
}
}
{
if (a<4 && a>0)
{
return 1;
}
else if(a>=4)
{
a = fn(a-1) + fn(a-3);
return a;
}
}
有个莲花池里起初有一只莲花,每过一天莲花的数量就会翻一倍。假设莲花永远不凋谢,30天的时候莲花池全部长满了莲花,请问第23天的莲花占莲花池的几分之几?
首先定义最终终止条件f(1)=1;
然后定义递归公式中f(n)=f(n-1)*2。
#include<stdio.h>
int fn(int a);
void main()
{
int a;
int b;
double c;
a = fn(30);
b = fn(23);
c = (double)b/a;
printf("%.20lf/n",c);
}
{
int a;
int b;
double c;
a = fn(30);
b = fn(23);
c = (double)b/a;
printf("%.20lf/n",c);
}
int fn(int a)
{
if(a == 1)
{
return 1;
}
else
{
a = fn(a-1)*2;
return a;
}
}
{
if(a == 1)
{
return 1;
}
else
{
a = fn(a-1)*2;
return a;
}
}