函数递归.

一、递归

在C语言中,递归就是函数自己调用自己

一个最简单的函数递归代码

如下:

函数递归._第1张图片

 结果为:

函数递归._第2张图片

在屏幕上无限循环打印hehe

代码最终进入死递归,导致栈溢出

 

递就是递推,归就是回归

 

递归的两个必要条件:

1.递归存在限制条件,当满足这个限制条件的时候,递归便不再继续

2.每次递归调用之后会越来越接近这个限制条件

 

 

 

二、递归举例

1.求n的阶乘

分析: n!=n*(n-1)!

函数递归._第3张图片

 函数递归._第4张图片

代码如下:

函数递归._第5张图片

 

结果为:

函数递归._第6张图片

 

2.顺序打印一个整数的每一位

先逆序打印 如下:

函数递归._第7张图片

函数递归._第8张图片 

 再顺序打印

思路:

函数递归._第9张图片

代码如下:

函数递归._第10张图片

函数递归._第11张图片 

每一次函数调用,都会向内存栈区上申请一块空间

这一块空间主要是用来存放函数的中局部变量,和函数调用过程中的上下文的信息这个一块空间一般叫:函数的运行时堆栈,也叫函数栈帧空间。

编译会自动根据需要开辟空间的!

 

 

 

三、递归与迭代

举例1:循环产生1-n的数字

代码如下:

函数递归._第12张图片

 

举例2:求第n个斐波那契数

实际上,计算第n个斐波那契数,是不适合使用递归求解的,但是斐波那契数的问题通过是使用递归的形式描述的

函数递归._第13张图片

这时会诱导我们将代码写成递归的形式

如下:

函数递归._第14张图片

但是当我们n输入为50的时候,需要很长时间才能算出结果,这个计算所花费的时间,是我们很难接受的,这也说明递归的写法是非常低效的

函数递归._第15张图片

其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计算,而且递归层次越深,冗余计算就会越多。

 

使用迭代的方式:

函数递归._第16张图片

函数递归._第17张图片 

迭代的方式去实现这个代码,效率就要高出很多了。

 

递归和迭代的选择:

1.如果使用递归写代码,非常容易,写出的代码没问题,那就使用递归

2.如果使用递归写出的问题,是存在明显的缺陷,那就不能使用递归,得用迭代的方式处理!

 

 

 

 

 

 

你可能感兴趣的:(c语言)