它作为一种算法在程序设计语言中应用的很广泛,一个函数或一个过程在定义或说明中间接调用自身的一种方法;通常把一个大型复杂问题层层转化,我的理解是去其糟粕,“炼”其精华,最后化成一个与原问题相似规模较小的问题来求解。他的突出就表现在只需少量程序就可以描述出解题过程所需的多次重复计算,大大的减少了程序的代码量。其重要思想,核心观念总结一下就是大事化小。
递归存在两个必要条件:1.限制条件,当满足这个限制条件时,递归中止。每次递归调用后越来越接近这个限制条件。(我反正一开始看的云里雾里)
于是我们这里端上一个简单的递归:
这个代码执行结果是死循环的,但后边儿停下了,现在vs2019还是蛮强的嘛。其实,这是递归中常见的一种错误——堆栈溢出。这里就是main函数自己调用自己,我们之前讲过内存的结构,我要在内存中的栈区为这次调用申请空间,然后咱把他死循环,栈区被榨干后,就会栈溢出。
题外话👏
既然扯到堆栈了,堆栈英文“stack overflow”,有一个全球性的同性交友♂网站也是由这个命名的,点击跳转它相当于程序猿的知乎,就是有人提问然后又有专业领域大神回答的平台,其火爆程度绝对不亚于Github。
下面是游客登录的主页:
语法格式👏
语法格式如下:
> void recursion() { statements; ... ... ... recursion(); /* 函数调用自身 */ ... ... ... > void recursion() { > } int main() { recursion(); }
具体使用情景👏
具有以下特征的问题可考虑递归求解:
当问题和子问题具有递推关系,比如杨辉三角、计算阶乘。或具有递归性质的数据结构,比如链表、树、图;还有反向性问题,比如取反。
说到根本上,最根本的还是要抓住问题本身是否可以通过层层分解来简化。