1.直接或者间接调用自身的一种方法;
通常把一个大型复杂的问题层层转化为一个与原问题相似规模的问题来求救。
2.递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算(减少程序的代码量)
注意:递归要有两个要素,结束条件与递推关系,只有不断靠近结束条件才能正常使用递归。如果没有这两个要素,程序将一直跑,直到栈溢出;
例题:
打印一个数的每一位。比如输入:123 打印:1 2 3
#include <stdio.h>
void print(int a)
{
if (a>9)
print(a / 10);
printf("%d ", a % 10);
}
int main()
{
int num;
scanf("%d", &num);
print(num);
return 0;
}
有些问题不适合使用递归;比如斐波那契数(前两个数为一,以后的数是前两项相加)
#include <stdio.h>
int Fbi(int a)
{
if (a > 2)
return Fbi(a - 1) + Fbi(a - 2);
else
return 1;
}
int main()
{
int n;
scanf("%d", &n);
int ret = Fbi(n);
printf("第%d个斐波那契数是%d\n", n, ret);
return 0;
}
求斐波那契数用递归计算有好多重复的,计算量非常大,此时不如用普通循环:
#include <stdio.h>
int Fbi(int s)
{
int a = 1,b=1,c=1;
while (s > 2)
{
c = a + b;
a = b;
b = c;
s--;
}
return c;
}
int main()
{
int n;
scanf("%d", &n);
int ret = Fbi(n);
printf("%d\n", ret);
return 0;
}
当解决一个问题 递归、非递归都可以使用,且没有明显问题,就可以使用递归;
综合以上情况,在熟练的情况下,递归确实能使程序简便,在初级阶段,能用循环尽量不要使用递归;