一、递归
在C语言中,递归就是函数自己调用自己
一个最简单的函数递归代码
如下:
结果为:
在屏幕上无限循环打印hehe
代码最终进入死递归,导致栈溢出
递就是递推,归就是回归
递归的两个必要条件:
1.递归存在限制条件,当满足这个限制条件的时候,递归便不再继续
2.每次递归调用之后会越来越接近这个限制条件
二、递归举例
1.求n的阶乘
分析:
n!=n*(n-1)!
代码如下:
结果为:
2.顺序打印一个整数的每一位
先逆序打印 如下:
再顺序打印
思路:
代码如下:
每一次函数调用,都会向内存栈区上申请一块空间
这一块空间主要是用来存放函数的中局部变量,和函数调用过程中的上下文的信息这个一块空间一般叫:函数的运行时堆栈,也叫函数栈帧空间。
编译会自动根据需要开辟空间的!
三、递归与迭代
举例1:循环产生1-n的数字
代码如下:
举例2:求第n个斐波那契数
实际上,计算第n个斐波那契数,是不适合使用递归求解的,但是斐波那契数的问题通过是使用递归的形式描述的
这时会诱导我们将代码写成递归的形式
如下:
但是当我们n输入为50的时候,需要很长时间才能算出结果,这个计算所花费的时间,是我们很难接受的,这也说明递归的写法是非常低效的
其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计算,而且递归层次越深,冗余计算就会越多。
使用迭代的方式:
迭代的方式去实现这个代码,效率就要高出很多了。
递归和迭代的选择:
1.如果使用递归写代码,非常容易,写出的代码没问题,那就使用递归
2.如果使用递归写出的问题,是存在明显的缺陷,那就不能使用递归,得用迭代的方式处理!