C# 递归算法实现方法 C#如何编写一个递归函数
发布时间 - 2026-01-28 00:00:00 点击率:次递归函数必须有前置终止条件,否则会无限调用导致栈溢出;C#栈空间有限(约1MB),递归过深即崩溃;终止判断须置于函数开头,不可依赖后续计算。
递归函数必须有明确的终止条件
没有终止条件的递归会无限调用,最终导致 StackOverflowException。C# 对栈深度有限制(通常约 1MB 栈空间),哪怕逻辑看似简单,一旦递归层级过深就崩溃。
写递归前先问自己:什么情况下该停止?这个判断必须放在函数开头,且不依赖后续计算。
- 错误写法:
if (n == 0) return 1;放在最后,中间还做了n * Factorial(n-1)—— 此时已发生一次调用,没防住越界 - 正确写法:先检查
n ,立刻返回,再处理递归分支 - 对用户输入要额外校验:
if (n
阶乘是最典型的 C# 递归示例
它直观体现「问题分解为相同结构的子问题」:求 n! 就是 n × (n−1)!,而 (n−1)! 又可继续拆解。
public static long Factorial(int n)
{
if (n < 0) throw new ArgumentException("n must be non-negative");
if (n <= 1) return 1; // 终止条件
return n * Factorial(n - 1); // 递归调用
}注意:long 类型仅支持到 20! 左右;超过需用 BigInteger。另外,Factorial(10000) 会直接栈溢出——这不是算法错,是 C# 运行时限制。
避免重复计算:斐波那契递归的坑
直接写 Fib(n) = Fib(n-1) + Fib(n-2) 看似自然,但时间复杂度是 O(2^n),因为大量子问题被反复计算。
- 调用
Fib(5)时,Fib(3)被算两次,Fib(2)被算三次 -
Fib(45)在普通机器上就要等好几秒,Fib(50)更久 - 这不是递归本身的问题,而是没做记忆化(memoization)
若坚持递归,应缓存结果:
private static readonly Dictionary_memo = new(); public static long Fib(int n) { if (n < 0) throw new ArgumentException("n must be non-negative"); if (n <= 1) return n; if (_memo.TryGetValue(n, out var value)) return value; value = Fib(n - 1) + Fib(n - 2); _memo[n] = value; return value; }
递归替代方案:什么时候该用循环
所有递归都能转成迭代(用栈或队列模拟调用栈),尤其当问题天然线性(如遍历树的深度优先

- 文件系统遍历:递归易因路径过深崩溃,
Directory.GetFiles(path, "*", SearchOption.AllDirectories)内部是迭代实现 - 解析嵌套 JSON 或 XML:用栈比递归更易中断、调试和限深
- 尾递归优化?C# 编译器不支持自动尾调用优化(Tail Call Optimization),即使写成尾递归形式(最后一个操作是调用自身),仍会压栈
真正需要递归的场景其实不多:语法树解析、回溯算法(如八皇后)、分治(归并排序的合并逻辑)——这些结构天然递归,硬改成迭代反而难读难维护。
# 栈
# 递归函数
# c#
# overflow
# if
# 递归
# 算法
# 迭代
# 放在
# 遍历
# 这不是
# 什么时候
# 都能
# 不多
# 两次
# 不支持
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
googleplay官方入口在哪里_Google Play官方商店快速入口指南
如何快速查询域名建站关键信息?
Java遍历集合的三种方式
如何快速生成凡客建站的专业级图册?
网站图片在线制作软件,怎么在图片上做链接?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
Java解压缩zip - 解压缩多个文件或文件夹实例
教你用AI将一段旋律扩展成一首完整的曲子
Laravel怎么调用外部API_Laravel Http Client客户端使用
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
如何用AWS免费套餐快速搭建高效网站?
如何确保西部建站助手FTP传输的安全性?
高端云建站费用究竟需要多少预算?
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
用v-html解决Vue.js渲染中html标签不被解析的问题
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
如何在云虚拟主机上快速搭建个人网站?
,南京靠谱的征婚网站?
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
Laravel如何使用Vite进行前端资源打包?(配置示例)
北京专业网站制作设计师招聘,北京白云观官方网站?
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
利用JavaScript实现拖拽改变元素大小
Laravel如何实现API速率限制?(Rate Limiting教程)
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
大连网站制作公司哪家好一点,大连买房网站哪个好?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
Laravel观察者模式如何使用_Laravel Model Observer配置
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
linux top下的 minerd 木马清除方法
深圳网站制作平台,深圳市做网站好的公司有哪些?
如何在万网自助建站中设置域名及备案?
做企业网站制作流程,企业网站制作基本流程有哪些?
如何自定义建站之星网站的导航菜单样式?
Laravel如何实现API版本控制_Laravel版本化API设计方案
Android GridView 滑动条设置一直显示状态(推荐)
JavaScript模板引擎Template.js使用详解
SQL查询语句优化的实用方法总结
Laravel怎么在Blade中安全地输出原始HTML内容
如何在Windows虚拟主机上快速搭建网站?
Bootstrap整体框架之JavaScript插件架构
如何在局域网内绑定自建网站域名?
微信小程序 wx.uploadFile无法上传解决办法
Linux安全能力提升路径_长期防护思维说明【指导】

