函数递归
函数递归:函数自己调用自己
问题:下方代码运行后会产生什么结果?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
printf("HAHA\n");
main();
return 0;
}
运行效果:死循环一段时间后,程序显示 stack over (栈溢出)
stack over的原因是 :每次函数调用,都会占一块内存空间。如果函数不返回,则函数开辟的空间一直占用,直到函数返回,才逐渐释放空间(开辟的空间,叫做"栈帧空间")。而一直不返回,直到开辟的空间占满栈区,产生的结果为 stack over
递归的思想
把一个大型的复杂的问题层层转化为一个与原问题相似,但规模较小的子问题来求解:直到子问题不能再被拆分,递归结束。(大化小)
书写递归的必要条件
• 递归存在限制条件,当满⾜这个限制条件的时候,递归便不再继续。
类似:循环语句的 判断
• 每次递归调⽤之后越来越接近这个限制条件。
类似:循环语句的 调整
问题:求n的阶乘
n!= n * (n-1)!
信息:阶乘的分段函数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int fun1(int n)
{
//实现正整数的阶乘
if (n == 0)
return 1;
else if (n > 0)
return n * fun1(n - 1);
//规避负整数
else
return -1;
}
int main()
{
int n = 0;
scanf("%d",&n);
int ret1 = fun1(n);
printf("%d", ret1);
return 0;
}
问题:顺序打印一个整数的每一位 (使用递归)
输入:1234
输出: 1 2 3 4
思考线路:
1234(n)%10 = 4 我们可以获得 个 位的数值。
回到题目,我们需要的是 所有位的数组
所以我们可以借用 1234/10去 调整 n数的个位,而依次获得所有位的值
停止条件,为n<10
综上列出依次获得数 : 4 3 2 1
联系递归的顺序
获得上图效果代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>void fun(int n)
{
if (n < 10);
else
fun(n / 10);
}int main()
{
int n = 0;
scanf("%d", &n);
fun(n);
return 0;
}
由上图我们可以详细的知道:
调用获得顺序为:4 3 2 1
回归获得顺序为:1 2 3 4
得出调用顺序和回归顺序相反
由题目我们需要的顺序为 1 2 3 4
我们在函数调用语句的下方添加 printf
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void fun(int n)
{
//打印 4 3 2 1
printf("%d ", n % 10);
if (n < 10)
//打印完 4 3 2 1 后换行
printf("\n");
else
fun(n / 10);
//打印 1 2 3 4
printf("%d ", n % 10);
}
int main()
{
int n = 0;
scanf("%d", &n);
fun(n);
return 0;
}
归纳:
代码
void fun(int n)
{
if (n < 9)
print(n / 10);
printf("%d ", n % 10);
}