5-求阶乘

现在进入递归的学习了,递归非常重要,使用的非常多。

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)的执行过程,递归的实现如下:
在这里插入图片描述
上面讲解了递归的基本概念,递归的实现。下面来说明一下递归的作用:

  1. 替代多重循环
  2. 解决本来就是用递归形式定义的问题
  3. 将问题分解为规模更小的子问题进行求解

3、总结

  1. 一个函数调用其自身
  2. 递归是通过栈实现的,理解递归调用过程

猜你喜欢

转载自blog.csdn.net/happyjacob/article/details/87216689