【C语言】递归

简介: 【C语言】递归

一、什么是递归

递归是函数在其内部调用自己,其下次计算使用上次计算的结果,并且计算公式相同。递归函数可以拆除成两个主要部分:

  • 结束条件:确定什么情况下停止递归。
  • 递归步骤:分解后的最小的相同问题,即相同的计算公式。

二、递归的基本结构

递归的基本结构就是前文讲的两个主要部分。

2.1、结束条件

- 防止无限递归,需要有递归停止的条件。
- 一般是直接返回结果,通常返回1个值。

2.2、递归步骤

- 这是将问题拆分成最小的子问题,每1步返回1个值。
- 函数反复调用自身来计算最小的子问题。

3、递归示例

3.1、计算阶乘

计算n!是递归的经典案例。

int factorial(int n) {
    if (n == 0) { // 结束条件
        return 1;
    } else {
        return n * factorial(n - 1); // 递归步骤
    }
}

假设n=2,factorial被调用3次,内部调用2次。

3.1.1、调用
  • 第1次–外部调用
  • factorial(2);
  • 内部第1次调用
  • 2 * factorial(1);
  • 内部第2次调用
  • 1 * factorial(0);

3.1.2、返回

  • 内部第2次调用返回结果:1 = 1
  • 内部第1次调用返回结果:1 = 1 * 1
  • 外部调用返回结果:2 = 2 * 1 * 1

3.2、斐波那契数列

斐波那契数列的递归计算如下。

int fibonacci(int n) {
    if (n <= 1) { // 结束条件
        return n;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2); // 递归步骤
    }
}

四、 递归的特性

4.1、递归深度

  • 每次递归调用都会在调用栈上分配新的空间。如果递归深度过大,可能会导致栈溢出。

4.2、性能问题:

  • 递归可能导致性能问题,因为每次递归调用都需要保存上下文和栈帧。对于某些问题,迭代(循环)可能更高效。

4.3、尾递归优化:

  • 某些编译器能够优化尾递归(即递归调用是函数中的最后一个操作),从而减少栈空间的使用。但这种优化在 C 语言中并不是所有编译器都支持。

五、递归的应用场景

  • 树结构的遍历:例如中序遍历、前序遍历、后序遍历。
  • 图的深度优先搜索:用于寻找路径或遍历图中的节点。
  • 分治算法:如快速排序、归并排序等,通过递归将问题分解为更小的子问题。

六、递归的注意事项

  • 结束条件:必须确保有明确的基准条件,否则递归将无法终止。
  • 递归深度控制:尽量避免过深的递归调用,如果可能,考虑使用循环来代替递归。
  • 资源管理:递归调用会消耗更多的栈空间,要注意避免不必要的资源浪费。

七、简单示列代码

一些常见的递归示例: 计算阶乘 斐波那契数列 递归遍历树结构。

相关文章
|
4月前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
46 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
2月前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
69 7
|
2月前
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
41 2
|
2月前
|
C语言
c语言回顾-函数递归(下)
c语言回顾-函数递归(下)
42 0
|
4月前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
100 0
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
|
4月前
|
C语言
C语言中的递归
C语言中的递归
|
5月前
|
存储 编译器 C语言
|
6月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
128 7
|
6月前
|
C语言
C语言--函数递归与迭代
C语言--函数递归与迭代
TU^
|
6月前
|
机器学习/深度学习 C语言
C语言之函数递归
C语言之函数递归
TU^
49 1