递归函数的定义:一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。递归函数就是反复调用其自己。递归函数要有两要素:1.递归表达式 2.终止条件
先引入一个例子:输入n,求n!。
分析:
n!= 1 * 2 * 3 * … * n
1)一般解法:
#include"stdio.h"
int main()
{
int n, i;
double s = 1;
scanf("%d", &n);
for(i = 1;i <= n;i++)
{
s *= i;
}
printf("%lf", s);
return 0;
}
先分析一下5!:
5!=1 * 2 * 3 * 4 * 5
||
5!=5 * 4 * 3 * 2 * 1
||
5!= 5 * 4! 如果要计算5!先要计算出4!
4!= 4 * 3! 如果要计算4!先要计算出3!
3!= 3 * 2! 如果要计算3!先要计算出2!
2!= 2 * 1! 如果要计算2!先要计算出1!
1!=1 1!就是1
上面从上至下的分析过程称之为递推
上述分析发现我们并没有计算5!的答案,那怎样算出5!的答案?
把分析的过程倒过来:
把1!的结果1代入上一个表达式中执行2 * 1,得到2!的结果2
把2!的结果2代入上一个表达式中执行3 * 2 ,得到3!的结果6
把3!的结果6代入上一个表达式中执行4 * 6,得到4!的结果24
把4!的结果24代入上一个表达式中执行5 * 24,得到5!的结果120
这个过程我们称之为递归
递归算法是一个基础类的算法,也是一个比较容易理解的算法,但是递归的扩展能力是无限的。
我们把上述分析变换成编程语言:
fact(5)=5 * fact(4)
fact(4)=4 * fact(3)
fact(3)=3 * fact(2)
fact(2)=2 * fact(1)
fact(1)=1
归纳出来就是:
fact(n)=n*fact(n-1) 如果要执行该操作必须满足条件(递归算法表达式)
fact(1)=1 如果要执行该操作必须满足条件(终结条件)
2)解法:
#include"stdio.h"
double fact(double n)
{
double s;
if(n >= 2)
{
s = n*fact(n-1);
}
else if(n ==1)
{
s = 1;
}
return s;//不输出因为每次计算的fact结果是用作其他数值的计算所用,另做他用,需要返回值。
}
int main()
{
double s,n;
scanf("%lf", &n);
s = fact(n);
printf("%lf",s);
return 0;
}