【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 语言中并不是所有编译器都支持。

五、递归的应用场景

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

六、递归的注意事项

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

七、简单示列代码

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

相关文章
|
1月前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
33 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
26天前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
|
1月前
|
C语言
C语言中的递归
C语言中的递归
|
2月前
|
存储 编译器 C语言
|
3月前
|
C语言
C语言--函数递归与迭代
C语言--函数递归与迭代
|
3月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
52 7
TU^
|
3月前
|
机器学习/深度学习 C语言
C语言之函数递归
C语言之函数递归
TU^
24 1
|
2月前
|
存储 算法 程序员
C语言编程—递归
递归是函数自我调用的编程技术,常用于解决分治问题,如计算阶乘和斐波那契数列。示例中展示了C语言的阶乘和斐波那契数列递归实现。递归需满足:问题可转化为规模更小的同类问题,存在结束条件以防止无限循环,并可能消耗大量时间和栈空间。栈用于存储函数调用信息,过多递归可能导致栈溢出。递归虽简洁,但非最优效率选择,递推算法通常是更好的替代方案。
35 0
|
3月前
|
C语言
【c语言】汉诺塔问题详解(c语言递归函数)
【c语言】汉诺塔问题详解(c语言递归函数)
19 0
|
3月前
|
C语言
【C语言】:递归题
【C语言】:递归题
26 0