C语言100篇:从入门到天花板 第17篇 函数嵌套与递归:递归思想与终止条件

张开发
2026/4/19 23:09:34 15 分钟阅读

分享文章

C语言100篇:从入门到天花板 第17篇 函数嵌套与递归:递归思想与终止条件
【独家】C语言100篇从入门到天花板 第17篇函数嵌套与递归递归思想与终止条件作者华夏之光永存前言大家好我是华夏之光永存欢迎继续阅读CSDN独家高质量专栏《C语言100篇从入门到天花板》。在前面我们学习了函数的定义、调用、参数传递已经可以完成模块化、结构化的程序编写。而今天要学习的递归Recursion是计算机科学中最优雅、最强大、最接近数学思维的编程思想也是二叉树、快速排序、二分查找、回溯、动态规划等高级算法的核心基础。本篇将从递归本质、思想拆解、嵌套与递归区别、终止条件、经典案例、栈溢出问题、企业级用法全方位精讲全文≥2000字底层逻辑图文拆解实战一步到位严格遵循本源法则化繁为简、回归本质、逻辑闭环。掌握递归你的编程思维将直接进入算法级。一、递归的本源什么是递归为什么它如此强大递归的本质只有一句话函数自己调用自己。就像镜子照镜子俄罗斯套娃故事里有同一个故事数学上的递推公式递归的核心思想把大问题拆解成结构相同但规模更小的子问题直到小到可以直接得出答案再一步步返回计算。递归与循环的区别循环从底向上重复执行递归从上向下拆解问题再回溯结果递归的代码更短、更接近数学公式、逻辑更清晰特别适合处理非线性、分层、嵌套结构树、图、目录、嵌套结构。二、递归的两个必备条件缺一不可递归不是无限调用必须满足两个铁律否则栈溢出崩溃1递归终止条件出口问题小到可以直接算出结果不再递归直接 return没有出口 死递归 栈溢出 程序崩溃2递归递推公式逼近出口把问题规模缩小向终止条件靠近保证递归能停下来三、递归执行过程调用 → 递去 → 归来递归完整流程分三步递去不断调用自己问题不断变小抵达到达终止条件开始返回归来一层层向上返回结果先递去后归来。四、最简单递归求阶乘入门必背数学公式n! n * (n-1)! 1! 1 0! 1递归代码longlongfactorial(intn){// 1. 终止条件if(n0||n1){return1;}// 2. 递推公式自己调用自己returnn*factorial(n-1);}执行 factorial(3) 过程factorial(3) 3 * factorial(2) 3 * 2 * factorial(1) 3 * 2 * 1 6五、递归经典案例1斐波那契数列公式f(1)1, f(2)1 f(n)f(n-1)f(n-2)代码intfib(intn){if(n1||n2)return1;returnfib(n-1)fib(n-2);}六、递归经典案例2字符串反转voidreverse(charstr[],intstart,intend){if(startend)return;chartempstr[start];str[start]str[end];str[end]temp;reverse(str,start1,end-1);}七、递归经典案例3求数组和intsumArr(intarr[],intlen){if(len0)return0;returnsumArr(arr,len-1)arr[len-1];}八、递归经典案例4汉诺塔递归巅峰入门汉诺塔是递归最经典、最教科书级案例把 n 个盘从 A 移到 C借助 B每次只能移一个大盘不能放小盘voidhanoi(intn,charA,charB,charC){if(n1){printf(%c - %c\n,A,C);return;}hanoi(n-1,A,C,B);printf(%c - %c\n,A,C);hanoi(n-1,B,A,C);}递归一行解决人类难以模拟的问题。九、函数嵌套 vs 函数递归彻底分清函数嵌套函数A调用函数B不同函数之间调用无自我调用voida(){b();}voidb(){}函数递归函数A调用自己同一个函数反复执行必须有出口voida(){a();}十、递归底层原理栈与栈帧递归为什么会溢出每调用一次函数系统就压入一个栈帧递归太深栈空间不够报错Stack Overflow递归深度有限制一般1万层以内大数据量必须改用循环或动态规划。十一、递归的优缺点优点代码极简、极优雅逻辑接近数学思维处理树、图、嵌套结构无敌缺点深度太大栈溢出重复计算如斐波那契效率略低于循环十二、高频致命错误99%新手必踩1没有终止条件 → 无限递归 → 崩溃voidfun(){fun();}2终止条件写错 → 永远到不了出口3递归没有缩小规模 → 死循环fun(n)→fun(n)4递归层次太深 → 栈溢出5混淆递去和归来的执行顺序十三、企业级递归编码规范先写终止条件再写递归逻辑递归深度不超过1000层高频重复计算用记忆化/动态规划能用递归清晰表达绝不强行写循环工程中树遍历、目录遍历、JSON解析、AST语法树大量使用递归十四、本源级核心总结递归 函数自己调用自己必须具备终止条件 规模缩小流程递去 → 抵达 → 归来递归适合分治、回溯、树、图、数学公式递归太深会栈溢出递归代码简洁循环效率更高递归是算法思维的基石十五、课后实战作业递归求 1~n 的和递归求字符串长度不使用strlen递归判断回文字符串递归求最大公约数 gcd递归实现二分查找下期预告第18篇我们将进入局部变量与全局变量生命周期与访问规则彻底搞懂C语言变量存哪里、活多久、谁能访问为后续指针、内存、静态库、模块化打下底层基础关注钩子本专栏为CSDN独家《C语言100篇从入门到天花板》100篇永久完整目录、每篇≥2000字高质量原创、底层原理企业实战全覆盖。关注华夏之光永存从零基础直冲C语言天花板指针、动态内存、网络、嵌入式、内核全体系一步到位

更多文章