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 fn(int 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 fn(int 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 fn(int 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 fn(int a)
{
if(a == 1)
{
return 1;
}
else
{
a = fn(a-1)*2;
return a;
}
}