现在进入递归的学习了,递归非常重要,使用的非常多。
1、递归的基本概念
一个函数调用其自身,就是递归。下面通过一个简单的例子来说明递归的过程。
例子:求n!的递归函数
n阶乘可以分解为n乘以n-1的阶乘问题,将问题分解为规模更小的子问题进行求解,用递归实现如下:
int Factorial(int n)
{
if (n == 0)
return 1;
return n * Factorial(n - 1);
}
下面来说明一下递归的调用顺序,在此之前先说明一下符号的含义
F(n)m:F表示Factorial函数,n表示参数为n,m表示程序执行到第m行
假设计算Factorial(3),递归调用过程如下:
F(3)3 -> F(3)5 -> F(2)3 -> F(2)5 -> F(1)3 -> F(1)5 -> F(0)3 -> F(0)4:
进入参数为3的函数计算,参数为3时执行第三行,第五行;进入参数为2的函数计算,执行参数为2的第三行,第五行;进入参数为1的计算,执行参数为1的第三行,第五行;进入参数为1的计算,执行参数为1的第三行,第四行。
返回过程:
返回1 -> F(1)5:返回1*1 -> F(2)5:返回2*1 -> F(3)5:返回3*2 -> 函数执行结束
返回1,执行参数为1的第五行,返回
2、递归的实现
递归和普通函数调用一样是通过栈实现的。
在调用函数时,保存函数的参数,保存函数的返回地址,然后跳转执行调用函数。返回时,根据保存的返回地址,返回到指定位置。
计算Factorial(4)的执行过程,递归的实现如下:
上面讲解了递归的基本概念,递归的实现。下面来说明一下递归的作用:
- 替代多重循环
- 解决本来就是用递归形式定义的问题
- 将问题分解为规模更小的子问题进行求解
3、总结
- 一个函数调用其自身
- 递归是通过栈实现的,理解递归调用过程