递归算法
![递归算法](https://img.360docs.net/img8b/1gbisfii91ch2inzogaxpef9c20g6v11-b1.webp)
![递归算法](https://img.360docs.net/img8b/1gbisfii91ch2inzogaxpef9c20g6v11-b2.webp)
1,递归介绍
1.递归的定义:函数调用其自身函数的编程技巧称为递归。
2.递归条件
(1)子问题必须与原始问题相同并且更简单;
(2)。不允许自己不受限制。必须存在一个出口,可以将其减少为非递归条件处理。
2,一个简单的递归示例
结运行果为:
结果为:120
这里递归调用的过程为:
递归调用实际上是函数调用,但是这些函数本身就是它们。记住一件事:谁打电话,谁回来。在上面的递归调用中,首先,我一直向下进行直到num==0,返回1,这是fun(0)函数的值,但是调用fun(0)函数就是fun(1)函数,因此fun(0)函数的值1返回到fun(1)函数(谁调用返回给谁),相同的原因始终返回到fun(5)函数,因为fun(5)函数在主函数中被调用,因此返回主函数一个值,该值为5!只要了解上面的图片,我几乎可以理解。
3,递归的基本原理
1.函数调用的每个级别都有其自己的变量。
2.每个函数调用将返回一次。当程序执行到递归级别的末尾时,它将移至上一个递归级别以继续执行。程序不直接返回main()中的初始调用部分,而是逐步返回每个递归级别,即从一个func()级别到调用它的级别。
3.在递归函数中,递归调用之前的语句和所有级别的被调用函数具有相同的执行顺序。
4.在递归函数中,递归调用后语句的执行顺序与每个被调用函数的执行顺序相反。
5.尽管每个递归级别都有其自己的变量。但是不会复制功能代码。功能代码是一系列计算机指令。函数调用从头开始执行相应功能的指令集。除了每次都创建变量之外,递归调用与循环语句非常相似。
6.递归函数必须包含可以终止递归调用的语句。
4,递归的优缺点
优点:
1.简单性
2.在遍历树的前顺序,中顺序和后顺序的算法中,递归的实现比循环的实现要简单得多。
缺点:
1.递归是函数调用本身,函数调用占用时间和空间:每个函数调用都需要在内存堆栈中分配空间以保存参数,返回地址和临时变量,而将数据推入堆栈和弹出数据。->效率
2.重复进行许多递归计算,因为其本质是将一个问题分解为两个或更多个小问题。如果在许多小问题中存在重叠的部分,则将重复计算,例如FibonacciFibonacci序列的递归实现。->效率
3.调用堆栈可能溢出。实际上,每个函数调用都会在内存堆栈中分配空间。但是,每个进程的堆栈容量是有限的。当调用级别太多时,
将超出堆栈的容量,从而导致堆栈溢出。->性能