五.函数(2)——函数递归
原文地址:https://beryl-licorice-3a8.notion.site/2-024e7053e9e040feae48e95fb13b7164?pvs=4
1.递归是什么?
简而言之,函数递归就是函数自己调用自己,函数递归只是一种解决问题的办法
#include <stdio.h>
int main(){
printf("hehe"\n);
main();// main函数中又调用了main函数
return 0;
}//这就是一个简单的递归,只不过没什么用
Stack Overflow - Where Developers Learn, Share, & Build Careers
递归的思想:
把一个大型复杂问题层层转化为一个与原问题类似、规模较小的子问题进行求解,直到子问题不能再被拆分 递归的思考方式就是把大事化小的过程
递归就是递推和回归,回归函数值,递推函数进行过程
2.递归的限制条件
- 递归存在限制条件,满足这个条件,递归便不再进行下去。
- 每次递归调用后,递推条件会逐渐逼近。
Eg: 求n的阶乘!
int fact(int n){
int result = 0;
if (n == 0) {
result = 1;}
else result = n * fact(n - 1);
return result;
}
int main(){
int n = 0;
scanf("%d", &n);
int result = fact(n);
printf("%d ", result);
return 0;}
这里我有几点想要强调:
- 定义函数的返回值最好只有一个,虽然有多个return更简洁,但不利于代码的逻辑性和查错能力。
- 思路是什么?
每一个数的的阶乘都是前一个数的阶乘与自己本身的乘积!
n*fact(n-1)
就是这个作用
- 注意理解回归和递推的作用!
下面来分析递推和回归的过程:
也就是思考的时候我们要逆向思考,就是要把递推到底的结果想象出来。然后回归就是逆向实现我们构造的递推的过程。
我们再来看一个稍难的例子:顺序输出输入的数字:
void Print(int n)
{
if (n > 9)
{
Print(n / 10);
}
printf("%d",n%10);
}
int main()
{
int n = 0;
scanf("%d", &n);
Print(n);}
这两个例子足够说明递推的思维!尤其是第二个例子,我们运用更