目录
1.什么是递归:
写一个简单的C语言递归代码:
#include<stdio.h>
int main()
{
printf("hehe\n");
mian();
return 0;
}
上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式,不是为了解决问题,代码最终会陷入死递归,导致栈溢出(Stack overflow)。
栈溢出的原因:
1.1递归的思想:
递归中的递就是递推的意思,归就是回归的意思,接下来慢慢体会 。
1.2递归的限制条件:
递归在书写的时候,有2个必要条件:
2.递归举例:
2.1举例1:求n的阶乘:
2.1.1 分析和代码实现:
以5!为例子我们进行分析
如下图所示:
代码实现如下:
#include<stdio.h>
int Fact(int n)
{
if (n > 0)
{
return n * Fact(n - 1);
}
else
{
return 1;
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fact(n);
printf("%d", ret);
}
运行结果如下:
2.1.2图示递归过程:
2.2举例2:顺序打印一个整数的每一位:
输入一个整数m,按照顺序打印整数的每一位
例如:
2.2.1分析和代码实现:
这个题目,放在我们面前,首先想到的是,怎么得到这个数的每一位呢?
如果n是一位数,那么取出的数字就是它本身,如果n超过一位数(即n>9),就需要拆分每一位。
例如1234:
那么我们可以这么想,每一个数字的最低位置是最容易得到的,通过%10就可以得到
我们设想写一个函数Print()来打印n的每一位,如下表示:
Print(n)
如果n是1234,则表示为
Print(1234)//打印1234的每一位
其中1234中的4可以通过%10得到
那么Print(1234)可以分为两步:
1.Print(1234/10)//相当于Print(123)打印123的每一位
2.printf(1234%10)//打印4
完成了上述两个步骤就完成了1234的每一位打印
那么Print(123)又可以拆分为Print(123/10)+printf(123%10)
以此类推下去就有:
直到被打印的数字变成一位数的时候,就不再需要拆分,递归完成,有了上述的分析,代码可以清晰的写出,如下所示:
#include<stdio.h>
void Print(int n)
{
if(n>9)
{
Print(n / 10);
printf("%d ", n % 10);
}
else
{
printf("%d ", n);
}
}
int main()
{
int n = 0;
scanf_s("%d", &n);
Print(n);
}
运行结果如下:
2.2.2图示递归过程:
以上便是我为大家带来的函数递归的第一部分内容,若有不足,望各位大佬在评论区指出,谢谢大家!可以留下你们点赞、收藏和关注,这是对我极大的鼓励,我也会更加努力创作更优质的作品。再次感谢大家!