目录
前言
若是不了解C语言函数的看官可以看看不才写的 🔗:【C语言】函数-CSDN博客
本篇我们聊聊什么是函数的递归。
一.什么是递归
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接 调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问 题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程 序的代码量。
- 函数自己调用自己的编程技巧称为递归
- 递归的主要思考方式在于:把大事化小
二.C语言史上简单的递归
史上最简单的递归
#include <stdio.h>
int main() {
main();
return 0;
}
- 在上述代码中,main函数中调用main函数,这样就形成了一个最简单的递归,虽然在main函数中没有其他代码。
运行逻辑如下:
递归演示1
在视频中我们可以看到函数一直在递归,没有停下,但是我们在程序正常运行时候我们会发现程序会自动停止下来什么都没输出。
三.递归的两个必要条件
- 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
- 每次递归调用之后越来越接近这个限制条件。
在运用递归时若不满足上述两个必要条件中的其一都将出现死递归,在出现死的归后,只要程序继续运行一段时间则会停止下来并报错:stack overflow(栈溢出)。
接收一个整型值(无符号),按照顺序打印它的每一位。(例如:1234 输出:1 2 3 4)
这时候就可以运用到递归。递归的核心思想就是把大事化小
#include <stdio.h>
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int num = 1234;
print(num);
return 0;
}
- 如上述代码中print函数如果n > 9 的情况下,则进入他自身的print函数且n / 10,直到n < 9时则打印N % 10,则返回上层的print函数直到回到main函数后,程序继续运行。
- 程序结束后则会输出:1 2 3 4
在上述代码中,满足了两个必要条件就没有出现死递归的情况。
四.递归的过程
在上面的栗子中虽然完成了任务,但是我们并不知道其过程是怎么实现的。不才用视频来演示其在内存的过程。
递归的过程
在上述过程中我们就可以看出递归在内存过程的运行(内存的存储非严谨,但过程绝对严谨,对内存的存储和函数的压栈感兴趣的看官老爷可以移步到函数的压栈文章)
最终我们可以的到函数运行过程图
好了,你已经学会围棋规则了,请下棋下哭柯洁吧。
以上就是本章所有内容。若有勘误请私信不才。万分感激!