定义:自己直接或者间接调用自己
注意: 避免递归次数太多(出现栈溢出)或者死递归
原理:
例:
求n的阶乘
int Fac(int n)
{
if(n==0 || n==1)
return 1;
else
return Fac(n-1)*n;//(n-1)!
}
最适合用递归的问题
汉诺塔,将n个盘子从a,通过b移到c
void Move(char x,char y)//模拟移动
{
printf("%c->%c\n",x,y);
}
void Hanoi(int n,char a,char b,char c)
{
if(n == 1)
Move(a,c);
else
{
Hanoi(n-1,a,c,b);
Move(a,c);
Hanoi(n-1,b,a,c);
}
}
斐波那契数列是最不适合使用递归编程实现的例子
求第n项的斐波那契数列的值
f(n) = f(n-1) + f(n-2)
1,1,2,3,5,8,13 …
不好用的原因:效率差,从原理可以看出来
int Fibon(int n)
{
if(n==1 || n==2)
return 1;
else
return Fibon(n-1) + Fibon(n-2);
}
用循环的话就很适合
重点
int Fibon1(int n)
{
int f1 = 1;
int f2 = 1;
int f3 = 1;
for(int i=2;i<n;i++)
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
划重点:
当函数调用次数过多,就避免使用递归,这个时候循环更具有优势,递归是自己直接或间接的调用自己,所以函数中一定会再次出现一个或多个自身函数的使用,即函数中必定会有函数名的再次出现。多数需要考虑(n-1)的情况。