【新手解答9】深入探索 C 语言:递归与循环的应用2

简介: 【新手解答9】深入探索 C 语言:递归与循环的应用2


写在最前面

一位粉丝私信交流,回想起了当初的我C语言一题写一下午的,而且很多概念糊糊的不清楚。借助这次机会,整理了相关 C 语言中最常见而关键的疑惑,并对概念进行解答。

这章重点:

澄清一下关于递归、循环以及 if-else 判断的关系,以及它们在编程中的作用。

本篇博客的前身:

【新手解答1】深入探索 C 语言:变量名、形参 + 主调函数、被调函数 + 类和对象 + 源文件(.c 文件)、头文件(.h 文件)+ 库

【新手解答2】深入探索 C 语言:变量名、变量 + 函数声明 vs 函数定义 + main的声明 + 头文件和源文件的关系

【新手解答3】深入探索 C 语言:头文件提供必要的接口、源文件保持实现细节的私有性 + 进一步学习的方向 + 如何快速编写程序并最终能制作小游戏

【新手解答4】深入探索 C 语言:全局变量声明、全局函数声明 + 宏定义

【新手解答5】深入探索 C 语言:宏中的文本、标识符和字符串 + 递归运算、条件语句、循环 + switch-case 与多项条件和枚举的差别

【新手解答6】深入探索 C 语言:算法流程图(条件判断、循环)+ 字符常量 + switch的具体用法 + 关于namespace + import vs include

【新手解答7】深入探索 C 语言:代码缩进 + 变量作用域、静态变量 + 变量名和函数名重名

【新手解答8】深入探索 C 语言:递归与循环的应用

如有不对的地方欢迎指出!好久没接触C了hh

问题交流

我想问的其实是else后面,需要重新投入判断条件进行循环,这样的话该怎么处理?

我发现使用if和循环都有判断条件或者说是起始条件吧

那这就又回到上面那个问题了,递归到底有没有达成循环什么的?(等等,好像又绕进去了,有点懵)

递归和循环

递归和循环都是用来重复执行代码的结构,但它们的工作方式不同:

  • 递归:在递归中,函数通过调用自身来重复执行。每次调用都会接近于结束条件。递归通常用于问题可以自然分解为相似子问题的场景。
  • 循环:循环(如 whilefor)通过重复执行代码块直到满足结束条件来处理重复任务。循环适合于执行固定次数的操作或在特定条件下持续执行。

if-else 和循环的结合

if-else 语句可以与循环结合使用,以在循环中根据不同条件执行不同的操作。例如,你可以在循环内部使用 if-else 来判断某个条件,并据此决定是否继续循环或进行其他操作。

递归中的 if-else

在递归函数中,if-else 通常用于定义:

  • 递归的结束条件(基本情况):何时停止递归。
  • 递归的步骤(递归情况):如何递归地调用函数。

例子

假设你有一个递归函数 f,当 n 小于或等于 5 时,函数返回 n 的值;否则,函数递归调用自身,参数为 n-3

int f(int n) {
    if (n <= 5)
        return n;  // 结束条件
    else
        return f(n - 3);  // 递归步骤
}

在这个例子中:

  • 如果 n 小于或等于 5,函数返回 n,递归结束。
  • 如果 n 大于 5,函数递归调用自身,n 减去 3。

递归是否形成循环?可以理解为特殊形式的循环

递归本身并不是“循环”结构,但它实现了重复执行代码的效果。在每次递归调用中,函数都在向一个结束条件逼近,这类似于循环的迭代。

然而,递归是通过函数调用自身来实现的,而循环是在同一函数内重复执行代码块。

递归示例:计算阶乘

递归本身并不是一个循环结构,但它实现了类似循环的行为,即重复执行代码。

递归是函数自我调用的过程,每次调用通常都会使问题规模变小,直到达到一个基本情况(停止条件),这时递归结束。

一个典型的递归例子是计算一个数的阶乘。阶乘函数 factorial(n) 定义为 n! = n * (n-1) * (n-2) * ... * 1。在递归形式中,我们可以将 n! 表达为 n * (n-1)!

#include <stdio.h>
// 递归函数计算阶乘
unsigned long long factorial(int n) {
    if (n <= 1) return 1; // 基本情况:0! = 1 和 1! = 1
    else return n * factorial(n - 1); // 递归步骤
}
int main() {
    int number = 5;
    printf("Factorial of %d is %llu\n", number, factorial(number));
    return 0;
}

在这个例子中:

  • n 为 1 或更小时(基本情况),函数直接返回 1,递归结束。
  • 否则,函数返回 n * factorial(n - 1),即当前数字乘以更小数字的阶乘(递归步骤)。

这个递归过程并不是传统意义上的循环,但它通过函数自我调用来重复执行,每次递归都会使问题规模减小。

递归与循环的区别

虽然递归和循环都用于重复执行代码,但它们的机制不同:

  • 循环:在同一个函数内部重复执行一段代码,直到满足某个条件。
  • 递归:函数调用自身,每次调用都在尝试解决更小的问题,直到达到基本情况。

递归可以看作是一种特殊形式的循环,但它通过函数自我调用而不是代码块的重复来实现重复行为。

递归通常用于问题可以自然分解为相似子问题的情况,特别是在问题的结构是自然递归的(如树结构)时。

结论

  • 递归和循环都用于重复执行代码,但它们的实现方式和适用场景不同。
  • if-else 可以在循环和递归中使用,用于基于条件控制流程。
  • 递归函数通过 if-else 定义递归的结束条件和递归步骤,而循环通常使用 if-else 来在每次迭代中根据条件执行不同的代码。
目录
相关文章
|
27天前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
|
1月前
|
C语言
初识C语言2——分支语句和循环语句
初识C语言2——分支语句和循环语句
66 5
|
23天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
53 7
|
24天前
|
C语言
【c语言】循环语句
循环结构是C语言中用于简化重复操作的重要工具,主要包括while循环、do-while循环和for循环。while循环是最基本的形式,通过不断检查条件来决定是否继续执行循环体。do-while循环则先执行循环体,再检查条件,至少执行一次。for循环逻辑更复杂,但使用频率最高,适合初始化、条件判断和更新变量的集中管理。此外,循环中还可以使用break和continue语句来控制循环的提前终止或跳过当前迭代。最后,循环可以嵌套使用,解决更复杂的问题,如查找特定范围内的素数。
34 6
|
1月前
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
31 2
ly~
|
1月前
|
网络协议 算法 关系型数据库
C语言的应用
C 语言因其高效性和对硬件的直接访问能力,在多个领域有广泛应用。在系统软件领域,它被用于开发操作系统(如 Unix 和 Linux 的内核)和嵌入式系统(如汽车电子控制系统)。在游戏开发中,C 语言常用于构建游戏引擎的底层部分(如 Unity 和 Unreal Engine 的核心模块)及性能要求高的独立游戏。此外,C 语言也用于数据库管理系统(如 MySQL 和 PostgreSQL 的核心功能)和网络编程(如 TCP/IP 协议栈和网络服务器的核心模块)。
ly~
31 3
|
1月前
|
C语言
教你快速理解学习C语言的循环与分支
教你快速理解学习C语言的循环与分支
15 0
|
1月前
|
C语言
c语言回顾-函数递归(下)
c语言回顾-函数递归(下)
37 0
|
1月前
|
小程序 C语言
初识C语言:走近循环
初识C语言:走近循环
|
3月前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
76 0
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)