函数递归.

简介: 这篇内容介绍了递归的概念,指出在C语言中递归是函数自我调用。它通过一个简单的死递归示例展示了未设置停止条件会导致栈溢出。接着,文章阐述了递归的两个必要条件:存在限制条件以终止递归,以及每次递归调用都更接近这个限制条件。随后,文章通过计算阶乘和顺序打印整数位的例子展示了递归的应用,并对比了递归和迭代的效率,强调在存在冗余计算时,迭代通常比递归更高效。

一、递归


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


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


如下:



结果为:





在屏幕上无限循环打印hehe


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


递就是递推,归就是回归

 

递归的两个必要条件:


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


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



二、递归举例


1.求n的阶乘


分析:

n!=n*(n-1)!





代码如下:




结果为:





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


先逆序打印 如下:





再顺序打印


思路:



代码如下:




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


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


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



三、递归与迭代


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


代码如下:




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


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



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


如下:



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



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

 

使用迭代的方式:





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


递归和迭代的选择:

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


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

目录
相关文章
函数递归(详细解读)(下)
函数递归(详细解读)(下)
|
算法
函数递归(详细解读)(上)
函数递归(详细解读)(上)
|
编译器
【函数和函数递归】
【函数和函数递归】
57 0
|
1月前
递归
【10月更文挑战第23天】递归。
16 4
|
3月前
利用递归函数调用
利用递归函数调用。
35 9
|
2月前
函数的递归
函数的递归
18 0
|
6月前
|
C语言
C语言函数递归详解:理解递归的原理与应用
C语言函数递归详解:理解递归的原理与应用
126 0
|
7月前
|
机器学习/深度学习 算法
详解函数递归
详解函数递归
|
7月前
|
算法 Java C语言
C语言函数的递归
C语言函数的递归
64 0
|
7月前
|
机器学习/深度学习 编译器 C语言
关于函数递归的基础
关于函数递归的基础
55 5