一、什么是递归
1.递归是解决问题的一种方法,在C语言当中,递归就是自己调用自己。
2.递归的思想:递归就是把一个大型复杂的问题层层转化为一个与原问题相似,但规模较小的问题来求解,直到子问题不能被拆分了,递归就就结束了。
二、递归的限制条件
1.递归存在限制条件,当递归满足这个限制条件,递归就不再进行了。
2.每次调用递归后,越来越接近这个条件。
三、递归的举例
举例1:
例如:求n的阶乘
在数学中,我们学过,n的阶乘就是n!=n*(n-1)*.....*1
eg:
5!=5*4*3*2*1;
4!=4*3*2*1;
3!=3*2*1;
用代码实现:
#include<stdio.h>
int p(int m)
{
if (m == 1)
return 1;
else
return m * p(m - 1);
}
int main()
{
int n = 0;
scanf_s("%d", &n);
int ret=p(n);
printf("%d", ret);
return 0;
}
流程图:
举例2:
顺序打印一个整数的每一位
#include<stdio.h>
void print(int m)
{
if (m > 9)
print(m / 10);
printf("%d ", m % 10);
}
int main()
{
int n = 0;
scanf_s("%d", &n);
print(n);
return 0;
}
流程图:
举例3:
求第n个斐波那契数
下面是斐波那契数的递推公式:
//递归
#include<stdio.h>
int Fib(int m)
{
if (m >= 3)
return Fib(m - 1) + Fib(m - 2);
else
return 1;
}
int main()
{
int n = 0;
scanf_s("%d", &n);
int ret = Fib(n);
printf("%d", ret);
return 0;
}
//迭代
#include<stdio.h>
int Fib(int m)
{
int c = 1, a = 1, b = 1;
while (m > 2)
{
c = a + b;
a = b;
b = c;
m--;
}
return c;
}
int main()
{
int n = 0;
scanf_s("%d", &n);
int ret = Fib(n);
printf("%d", ret);
return 0;
}
四、递归与迭代
递归虽然说看起来更简洁,但是每次调用函数,就会在栈区中申请一块空间,用来存放保存函数调用时的各种局部变量的值,这块空间我们叫做函数栈帧。
递归层数越多,就会浪费太多的栈帧空间,可能引起栈溢出。
因此,我们可以使用迭代的方法解决问题(也就是循环),当一个问题非常复杂,难以用迭代方式实现时,我们就可以使用递归。