news 2026/8/28 18:58:45

C语言中函数递归的实现(初识)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言中函数递归的实现(初识)

在C语言的基础学习中我们已经学会了循环语句的使用,回顾一下已经学习了for/while/do while循环语句

知识前提:栈帧,循环,if语句,函数的运用

什么是函数递归?

函数在函数体内调用自身的方法就叫做函数递归,下面是简单的函数调用自身,称为直接递归

void home() { home(); }

循环顾名思义就是重复执行代码,而函数递归则是函数在条件前提下调用自身,其运行程度往往比循环更加复杂。但函数递归的代码相比循环语句而言更加简洁,循环语句的表达往往更加繁琐

接下来我将用一个简单的例子-斐波那契数的计算运用函数递归

先回顾一下斐波那契数的定义:从第二项开始,后面的每一项等于前两项之和

先写出主函数main(),定义一个整数型变量n初始值为0,使用scanf函数读取一个整数,存入n的地址。

int main() { int n = 0; scanf("%d",&n); return 0; }

接着我们在主函数之前对斐波那契函数进行定义,给函数起名为fib,类型为int,需要知道斐波那契数的前两项是特殊的,即0和1,需要判别scanf函数输入的是否为第0项或第1项,以及给出相应的返回值,并给出正常项的返回值。其中前两项我们可以利用if语句轻松实现

定义int类型的n(主函数已初始为0)

int fib(int n) { if(n == 0) return 0; else if(n == 1) return 1; }

前两项讨论完,接下来再写正常项的返回值,及第3~正无穷项,此时涉及函数递归思想,可以理解为套娃

int fib(int n) { if(n == 0) return 0; else if(n == 1) return 1; else return fib(n - 1) + fib(n - 2); }

如果scanf给出4,则直接先来到else的返回值,程序开始计算fib(3) +fib(2),就发生类似套娃效应,fib(3)又来到else的返回值,程序开始计算fib(2) + fib(1),而这两次得到的fib(2)又要返回到else的返回值,计算fib(1) + fib(0),直至可直接回归返回值(只有fib(1)和fib(0)

暂时没找到好用的画图工具,一旦找到会给出清晰的图解,也可借助ai生成帮助理解

此时我们再来返回到主函数区块,完善主函数,定义一个变量r,赋予函数fib(n)的返回值,再将其打印出来,最终得到我们完整的主函数

int main() { int n = 0; scanf("%d",&n); int r = fib(n); printf("%d\n",r); return 0; }

头文件应该不用再强调,毕竟初学,这里还是强调一下

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h>

此时我们对于斐波那契数的计算已经实现,运行输入项数即可

但是我们会发现随着项数的增加,程序的计算时间也会增加,甚至发生卡顿现象,这是因为虽然代码看起来十分简洁,但是程序背后会经历十分庞大的运算,可搜斐波那契数金字塔相关图献加以了解其数字运算的庞大

例如n=50,运算时长可能长达30秒,若数字庞大也存在超出int范围的风险,此时需改用long long

简洁来说,在计算庞大的前提下,递归程序会影响性能

因为程序的每一次函数调用,都需要为本次函数调用在内存的栈区,申请一块内存空间来保护函数调用期间的各种局部变量的值,这块空间叫作运行时堆栈,即函数栈帧

函数不返回,函数对应的栈帧空间会一直占用,所以如果函数调用中存在递归调用的话,每一次递归函数调用都会开启属于自己的栈帧空间,直到函数递归不再继续,开始回归,然后才逐层释放栈帧空间

采用函数递归的方式完成代码,递归层次太深,会浪费很多栈帧空间,可能会引起栈溢出的情况,即可能发生崩溃

优化栈溢出的方式可以采用尾溢出,但是部分编译器不支持,也没过多了解,这里不再给出实例

由以上斐波那契数的实例,结合之前学过的循环语句,我们可以总结出以下

当一个问题非常复杂,难以用循环的方式实现,此时可以考虑递归的简洁性,递归的深度在一定范围内不会造成大量堆积,可以大胆使用递归写法

也可用ai辅助理解与优化代码

ps:内容可能存在不严谨的部分,以上仅为个人观点,最后修改时间2026 8 26 23:58

内容仅为个人学习C语言过程中的记录,不具有权威性,不足的地方欢迎指出

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 18:56:30

基于YOLO的肺部CT结节检测:从数据集解析到模型训练部署全流程

简介&#xff1a;目标检测是计算机视觉的核心任务之一&#xff0c;旨在识别图像中特定目标的位置和类别。其原理是通过深度学习模型学习图像特征与边界框坐标、类别标签之间的映射关系。在医疗AI领域&#xff0c;这项技术能极大提升诊断自动化水平与效率&#xff0c;尤其适用于…

作者头像 李华
网站建设 2026/8/28 18:55:07

【Gitee】SSH 公钥、GPG 公钥、私人令牌的区别

一、核心对比表维度&#x1f511; SSH 密钥✍️ GPG 密钥&#x1f3ab; 私人令牌本质密钥对&#xff08;公钥私钥&#xff09;密钥对&#xff08;公钥私钥&#xff09;一串随机字符串作用免密 push/pull 的身份认证给 commit 签名&#xff0c;证明是你提交的代替密码认证 / 调 …

作者头像 李华
网站建设 2026/8/28 18:55:04

从KV缓存到分布式存储,读懂大模型推理系统的底层优化逻辑

在大模型落地普及的当下&#xff0c;很多人钻研Transformer架构、微调算法和提示词工程&#xff0c;却常常忽略一个核心问题。同等算力显卡&#xff0c;有的推理服务每秒只能处理寥寥几个请求&#xff0c;有的却能轻松承载上百并发&#xff0c;长文本生成场景下的性能差距更是成…

作者头像 李华
网站建设 2026/8/28 18:53:45

数据安全相关基础操作文档(精简)

本精简版提取于数据安全岗位。对于求职或学习过程中的数据安全工程师/数据安全运维工程师有一定参考价值。纯个人总结。 第一部分&#xff1a;安全产品实操运维手册 第1章 DLP 数据防泄漏系统运维手册 职责&#xff1a;日常运维、策略配置、策略优化、告警研判、故障排查 每…

作者头像 李华
网站建设 2026/8/28 18:52:42

RAG 可观测性实战:上线后必须能定位“为什么答错“(五)

目录 前言&#xff1a; 1、为什么 RAG 比普通应用更需要可观测性 2、全链路追踪&#xff1a;六个节点一个都不能漏 2.1 RAG 全链路的六个节点 2.2 每个节点记录什么 2.3 Trace 的代码实现 3、结构化日志&#xff1a;每个字段都有它的用途 3.1 九个字段锁定问题根因 3.2…

作者头像 李华
网站建设 2026/8/28 18:52:07

数学建模第三天:用Numpy与Pandas掌握数据处理核心技能

1. 从“集训”到“实战”&#xff1a;第三天为何是分水岭&#xff1f; 如果你正在经历数学建模的集训&#xff0c;或者自己制定了学习计划&#xff0c;那么第三天往往是一个关键节点。前两天&#xff0c;你可能还在熟悉环境、回顾基础数学知识、了解建模的基本流程。到了第三天…

作者头像 李华