一、什么是递归?
程序调用自身的编程技巧称为递归(recursion)。
递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
可以利用网站 https://stackoverflow.com/
二、递归策略
只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小。一句话总结递归:自我调用且有完成状态。
1、递归就是一个函数在它的函数体内调用它自身。
2、执行递归函数将反复调用其自身,每调用一次就进入新的一层。
3、注意递归函数必须有结束条件
三、递归的两个必要条件
1、存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2、每次递归调用之后越来越接近这个限制条件。
四、练习:求n的阶乘
//利用递归的方式
//n<=1 ret=1
//n>1 n*Fac(n-1)
int Fac2(int n)
{
if (n <=1)
{
return1;
}
else
{
returnn * Fac2(n - 1);
}
}
int main()
{
int n = 0;
int ret = 0;
printf("请输入一个数字\n");
scanf("%d", &n);
ret = Fac2(n);//利用函数递归
printf("ret=%d\n",ret);
return 0;
}
五、栈溢出
系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出。
递归可以写成迭代,写成循环的方式来解决。
练习:描述第n个斐波那契数
递归可以写成迭代,写成循环的方式来解决。
前两个数相加等于第三个数
int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while (n > 2)
{
c= a + b;
a= b;
b= c;
n--;
}
return c;
}
int main()
{
//求第n个斐波那契数。(不考虑溢出)
//斐波那契数列(前两个数之和等于第三个数) 1 12 3 5 8 13 21 34 55 89...
//描述第n个斐波那契数
//n<=2 1
//n>2 Fib(n-1)+Fib(n-2)
int n = 0;
int ret = 0;
printf("请输入一个数字\n");
scanf("%d", &n);
ret = Fib(n);
printf("ret=%d\n", ret);
return 0;
}