- 了解递归
递归就是自己调用自己
写一个最简单的函数递归
#include <stido.h>
int main()
{
main();main函数中⼜调⽤了main函数
printf("66666");
return 0;
}
上述就是⼀个简单的递归程序,
代码最终也会陷⼊死递归,导致栈溢出(Stack overflow)
2.
递归思维:
把一个大型的复杂问题层层转化为规模小的问题,直到问题不能被拆解,递归就结束了。所以递归的思考⽅式就是把⼤事化⼩的过程。
举例1:求n的阶乘
我们知道n的阶乘的!公式:n! = n ∗ (n − 1)! 例如: 5! = 5*4!
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int dis(int n)
{
if (n ==0)
return 1;
if (n > 0)
{
return n * dis(n - 1);
}
}
int main()
{
int c;
int n;
scanf("%d", &c);
n = dis(c);
printf("%d的阶乘是%d",c,n);
return 0;
}
这是代码呈现
3.递归的不足:在有些情况下使用递归方法解决问题会产生重复计算相同的值导致效率低下;甚至因为编译器的环境在一些范围太大了的情况下导致错码影响结果 如下:
求第n个斐波那契数 1 1 2 3 5 8 13 21…
define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int fbnqs(int n)
{
if (n <= 2)
{
return 1;
}
else {
int b = fbnqs(n - 1) + fbnqs(n - 2);
return b;
}
}
int main()
{
int n, c;
scanf("%d", &n);
c = fbnqs(n);
printf("%d", c);
return 0;
}
如图:圈起来的都是重复计算的 像n=2基本上就重复计算了2的47次方
这就是因为计算量太多了导致效率低下。
在vs2022中 这个计算值超出了int 的范围导致错误
其实递归方法有点类似于循环像求第n个斐波那契数一样可以使用循环来实现而且计算效率高
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{ // 用循环求第n个斐波那契数 如n=8 1 1 2 3 5 8 13 21
int n, a=1, b=1, c=0;
scanf("%d", &n);
if (n == 1 || n == 2)
{
printf("%d", 1);
}
for ( int f = 2; f < n; f++)
{
c = a + b;
a = b;
b = c;
} printf("%d ", c);
}
迭代的⽅式去实现这个代码,效率就要⾼出很多了。
有时候,递归虽好,但是也会引⼊⼀些问题,所以我们⼀定不要迷恋递归,适可⽽⽌就好。